레코드 헬퍼의 제약 — 레코드는 클래스와 달라요

레코드 헬퍼의 제약 — 레코드는 클래스와 달라요

레코드는 클래스가 제공하는 것과 같은 가능성을 제공하지 않아요. 이는 레코드 헬퍼를 만들 때의 가능성에도 그대로 반영돼요. 아래에 레코드 헬퍼의 제약을 정리했어요.

출처: Restrictions on record helpers — Free Pascal Reference

본문

  • 레코드 헬퍼는 클래스를 확장하는 데 사용할 수 없어요. 다음은 실패해요.
TTestHelper = record helper for TObject
end;
  • 헬퍼 선언 안에서는 확장 레코드의 메서드/필드를 예를 들어 프로퍼티 정의에서 접근할 수 없어요. 물론 구현에서는 접근할 수 있어요. 즉 다음은 컴파일되지 않아요.
TTest = record
  Test: Integer;
end;

TTestHelper = record helper for TTest
  property AccessTest: Integer read Test;
end;
  • 레코드 헬퍼는 (가시성 지정자가 있는 확장 레코드를 사용할 경우) public 필드만 접근할 수 있어요.
  • 레코드 헬퍼의 상속은 ObjFPC 모드에서만 허용돼요. Delphi 모드에서는 허용되지 않아요.
  • 레코드 헬퍼는 다른 레코드 헬퍼에서만 하위로 파생될 수 있고, 클래스 헬퍼에서는 파생될 수 없어요.
  • 클래스 헬퍼와 달리, 하위 레코드 헬퍼는 같은 레코드 타입을 확장해야 해요.
  • Delphi 모드에서는 inherited로 확장 레코드의 메서드를 호출할 수 없어요. ObjFPC 모드에서는 가능해요. 다음 코드는 컴파일하려면 ObjFPC 모드가 필요해요.
type
  TTest = record
    function Test(aRecurse: Boolean): Integer;
  end;

  TTestHelper = record helper for TTest
    function Test(aRecurse: Boolean): Integer;
  end;

function TTest.Test(aRecurse: Boolean): Integer;
begin
  Result := 1;
end;

function TTestHelper.Test(aRecurse: Boolean): Integer;
begin
  if aRecurse then
    Result := inherited Test(False)
  else
    Result := 2;
end;

핵심은 레코드 헬퍼가 클래스 헬퍼보다 제약이 더 많다는 거예요. 특히 헬퍼 선언 안에서는 확장 레코드의 멤버에 접근할 수 없다는 점과, inherited 호출이 ObjFPC 모드에서만 가능하다는 점을 기억하세요.

더 알아보기