변형
변형 (Variant) — 정의
버전 1.1부터 FPC는 variant를 지원해요. 최대 variant 지원을 위해서는 variant를 어떤 방식으로든 사용하는 모든 유닛의 uses 절에 variants 유닛을 추가하는 것이 권장돼요. variants 유닛은 System이나 ObjPas 유닛이 기본 제공하는 지원 외에, variant를 검사하고 변환하는 지원을 포함해요.
출처: Definition
본문
variant에 저장된 값의 타입은 런타임에만 결정돼요. variant에 무엇이 대입됐는지에 따라 달라지죠. 거의 모든 단순 타입을 variant에 대입할 수 있어요. 순차 타입, 문자열 타입, int64 타입 같은 것들이요.
집합, 레코드, 배열, 파일, 객체, 클래스 같은 구조화 타입은 variant와 대입 호환되지 않아요. 포인터도 마찬가지예요. 인터페이스와 COM 또는 CORBA 객체는 variant에 대입할 수 있어요. (기본적으로 포인터일 뿐이라서요.)
즉 다음 대입들이 유효해요.
Type
TMyEnum = (One,Two,Three);
Var
V : Variant;
I : Integer;
B : Byte;
W : Word;
Q : Int64;
E : Extended;
D : Double;
En : TMyEnum;
AS : AnsiString;
WS : WideString;
begin
V:=I;
V:=B;
V:=W;
V:=Q;
V:=E;
V:=En;
V:=D;
V:=AS;
V:=WS;
end;
그리고 당연히 반대 방향도 유효해요.
variant는 값의 배열을 담을 수도 있어요. 배열의 모든 요소는 같은 타입이에요. (단 "variant" 타입일 수도 있어요.) 배열을 담은 variant는 인덱싱할 수 있어요.
Program testv;
uses variants;
Var
A : Variant;
I : integer;
begin
A:=VarArrayCreate([1,10],varInteger);
For I:=1 to 10 do
A[I]:=I;
end.
VarArrayCreate의 설명은 유닛 레퍼런스를 참고하세요.
배열이 문자열을 담고 있으면 그건 "문자 배열"로 간주되지 않아서, 문자열의 특정 위치 문자를 얻기 위해 variant를 인덱싱할 수 없다는 점에 주의하세요.
더 알아보기
variant는 타입을 런타임에 결정하는 동적 타입이에요. 단순 타입 간 유연한 대입이 필요한 COM/OLE 연동 등에서 유용하게 쓰여요.