(단순) 타입 헬퍼의 고려 사항 — 지원 타입과 모드
(단순) 타입 헬퍼의 고려 사항 — 지원 타입과 모드
단순 타입의 경우 규칙은 레코드와 거의 같고, 몇 가지 추가 요구 사항이 있어요.
출처: Considerations for (simple) type helpers — Free Pascal Reference
본문
- 타입 헬퍼 지원은
typehelpers모드 스위치로 활성화해야 해요.
{$modeswitch typehelpers}
이 모드 스위치는 Delphi와 DelphiUnicode 모드에서만 기본으로 켜져 있어요.
- Delphi(및 DelphiUnicode) 모드에서는 더 엄격한 Delphi 호환을 위해 타입 헬퍼 대신 레코드 헬퍼를 사용해야 해요.
- ObjFPC와 MacPas 모드는 타입 헬퍼를 사용하지만
TypeHelpers모드 스위치를 사용해야 해요. - 다음 타입은 지원되지 않아요.
- 모든 파일 타입(
Text,file of ...) - 프로시저 변수
- 레코드, 클래스, Objective C 클래스, C++ 클래스, 객체, 인터페이스 같은 타입도 금지돼요. 클래스에는 클래스 헬퍼를 사용해야 해요. 예를 들어 다음은 실패해요.
- 모든 파일 타입(
TTestHelper = type helper for TObject
end;
물론 이는 다른 모든 단순 타입이 지원된다는 뜻이에요.
- 타입 헬퍼는 생성자를 구현할 수 있어요.
- 레코드 헬퍼의 상속은 ObjFPC 모드에서만 허용돼요. Delphi 모드에서는 허용되지 않아요.
- 타입 헬퍼는 다른 타입 헬퍼에서만 하위로 파생될 수 있고, 클래스나 레코드 헬퍼에서는 파생될 수 없어요.
- 하위 타입 헬퍼는 같은 타입을 확장해야 해요.
다음은 가능성을 보여주는 예시예요.
{$mode objfpc}
{$modeswitch typehelpers}
type
TLongIntHelper = type helper for LongInt
constructor create(AValue: LongInt);
class procedure Test; static;
procedure DoPrint;
end;
constructor TLongIntHelper.create(AValue: LongInt);
begin
Self:=Avalue;
DoPrint;
end;
class procedure TLongIntHelper.Test;
begin
Writeln('Test');
end;
procedure TLongIntHelper.DoPrint;
begin
Writeln('Value :',Self);
end;
var
i: LongInt;
begin
I:=123;
i.Test;
$12345678.Test;
LongInt.Test;
I:=123;
i.DoPrint;
$12345678.DoPrint;
end.
핵심은 타입 헬퍼가 단순 타입(정수, 상수 리터럴, 심지어 타입 이름 자체)에도 메서드를 붙일 수 있게 해준다는 거예요. 이 예제에서 i.Test, $12345678.Test, LongInt.Test처럼 값, 리터럴, 타입 이름 모두에서 클래스 메서드를 호출하고, 인스턴스 메서드(DoPrint)도 값에서 호출해요.
더 알아보기
- 타입 헬퍼의 기본 개념은 Definition을 참고하세요
- 레코드/타입 헬퍼의 수명 관련 주의점은 A note on scope and lifetime에서 다뤄요