Default로 변수 초기화하기
Default로 변수 초기화하기 (Initializing Variables Using Default)
일부 변수는 관리되는 타입(managed type)을 담고 있어서 반드시 초기화해야 해요. 함수의 var 절이나 메인 프로그램에 선언된 변수는 자동으로 초기화되지만, 힙에 할당한 변수는 그렇지 않을 수 있어요. 이때 사용할 수 있는 게 컴파일러의 Default 내장 함수예요.
본문
Default 함수는 타입 식별자를 인자로 받아, 그 타입의 올바르게 초기화된 변수를 돌려줘요. 본질적으로 변수 전체를 0으로 채우는 방식이에요.
type
TRecord = record
i: LongInt;
s: AnsiString;
end;
var
i: LongInt;
o: TObject;
r: TRecord;
begin
i := Default(LongInt); // 0
o := Default(TObject); // Nil
r := Default(TRecord); // ( i: 0; s: '')
end.
힙에 변수를 할당한 경우가 더 흥미로워요.
type
TRecord = record
i: LongInt;
s: AnsiString;
end;
var
i: ^LongInt;
o: ^TObject;
r: ^TRecord;
begin
i:=GetMem(SizeOf(Longint));
i^ := Default(LongInt); // 0
o:=GetMem(SizeOf(TObject));
o^ := Default(TObject); // Nil
r:=GetMem(SizeOf(TRecord));
r^ := Default(TRecord); // ( i: 0; s: '')
end.
Default는 다양한 파일 타입(또는 파일 타입을 담은 복합 타입)을 제외한 모든 타입에서 동작해요.
몇 가지 알아두면 좋은 점이 있어요.
- **제네릭(generics)**에서 특히 유용해요. 제네릭을 선언하는 시점에는 변수의 타입을 모를 수 있으니까요. 자세한 내용은 8.7절(484쪽)을 참고하세요.
- 함수 결과는
Result식별자로 접근하는데 변수처럼 보이지만 실제로는 참조로 전달되는 매개변수처럼 취급돼요. 따라서 초기화되지 않아요.
더 알아보기
- Initialized variables — 변수 선언에서 초기값을 함께 주는 초기화 변수 개념
- Managed types — 관리되는 타입의 초기화 규칙(3.9절)