정의 — 클래스·레코드·타입 헬퍼
정의 — 클래스·레코드·타입 헬퍼
클래스, 레코드, 타입 헬퍼는 기존 클래스/레코드/단순 타입을 파생시키거나 다시 선언하지 않고도 메서드를 추가할 수 있게 해줘요.
본문
레코드나 단순 타입의 경우, 타입 헬퍼는 마치 레코드나 단순 타입이 클래스인 것처럼 동작하고 그에 대해 메서드를 선언해요. 메서드 안에서 Self는 레코드나 단순 타입의 값을 가리켜요.
클래스의 경우 그 효과는 클래스의 메서드 테이블에 메서드를 삽입하는 것과 같아요. 헬퍼 선언이 현재 코드 범위에 있으면 헬퍼의 메서드와 프로퍼티를 그 헬퍼가 확장하는 클래스/레코드의 선언 일부인 것처럼 사용할 수 있어요.
클래스/레코드/타입 헬퍼의 문법 다이어그램은 문서를 참고하세요. 다이어그램은 헬퍼 정의가 일반 클래스 정의와 아주 비슷해 보인다는 걸 보여줘요. 클래스/레코드/단순 타입에 몇 가지 추가 생성자, 메서드, 프로퍼티, 필드를 선언하는 것뿐이에요. 헬퍼가 확장하는 대상은 for 키워드 뒤에 표시돼요.
클래스의 열거자는 일반 메서드를 통해 얻어지므로, 클래스 헬퍼는 클래스의 열거자를 오버라이드하는 데도 사용될 수 있어요.
문법 다이어그램에서 볼 수 있듯이 헬퍼의 하위(descendant)를 만드는 것도 가능해요. 헬퍼는 그들만의 계층을 형성할 수 있고, 부모 헬퍼의 메서드를 오버라이드할 수 있어요. 레코드와 클래스처럼 가시성 지정자도 있어요.
클래스 인스턴스에서와 같이, 클래스 헬퍼 메서드의 Self 식별자는 헬퍼 인스턴스가 아니라 클래스 인스턴스를 가리켜요. 레코드의 경우에는 레코드를 가리켜요.
다음은 TObject 클래스에 대한 간단한 클래스 헬퍼로, 표준 ToString 메서드의 대체 버전을 제공해요.
TObjectHelper = class helper for TObject
function AsString(const aFormat: String): String;
end;
function TObjectHelper.AsString(const aFormat: String): String;
begin
Result := Format(aFormat, [ToString]);
end;
var
o: TObject;
begin
Writeln(o.AsString('The object''s name is %s'));
end.
Remark
helper수식어는class또는record키워드 직후의 수식어일 뿐이에요. 즉 클래스나 레코드의 첫 번째 멤버는helper라는 이름을 가질 수 없어요. 클래스/레코드의 멤버를helper라고 부를 수는 있지만, 키워드와 일치하는 모든 식별자처럼&로 이스케이프하지 않으면 첫 번째가 될 수는 없어요.
Remark 타입 헬퍼(ttype helper) 지원은 Delphi 모드를 사용하거나 다른 모드에서
typehelpers모드 스위치를 사용해야 해요.
{$MODESWITCH TYPEHELPERS}
Remark 레코드 헬퍼 지원은 Delphi 모드를 사용하거나 다른 모드에서
advancedrecords모드 스위치를 사용해야 해요.
{$MODESWITCH ADVANCEDRECORDS}
핵심은 헬퍼가 기존 타입을 다시 쓰지 않고 "꾸며주는" 수단이라는 거예요. 레코드/단순 타입은 값 기반이라 Self가 값을 가리키고, 클래스는 메서드 테이블에 메서드를 끼워 넣는 방식이에요.
더 알아보기
- 클래스 헬퍼의 제약은 Restrictions on class helpers를 참고하세요
- 레코드 헬퍼의 제약은 Restrictions on record helpers에서 다뤄요
- 타입 헬퍼의 세부 사항은 Considerations for (simple) type helpers를 참고하세요