상세 컨텐츠

본문 제목

Record vs Object

프로그래밍/Delphi

by ryujt 2012. 4. 27. 15:22

본문

터보 파스칼 5.5부터인가 지원되던 object라는 키워드가 있습니다.  구조체에 메소드를 추가할 수 있는 타입이라고 생각하시면 됩니다.  클래스는 객체를 힙에 생성하지만, object로 생성된 객체는 스택에 생성되는 등, class와 유사하면서도 다른 면들이 많습니다.


최근에 델파이의 record에도 메소드를 추가할 수 있기 때문에 크게 필요가 없어진 키워드이긴 하지만, 가끔 사용하고 싶은 충동일 생길 경우가 있습니다.  바로 상속을 사용하고 싶을 때 입니다.  구조체는 상속이 되지 않지만 object는 상속이 가능합니다.


조심해야 할 문제는 바로 object는 구조체와 달리 packing(packed)을 할 수 없다는 점 입니다.  [소스 1]에서 보시면 packing하지 않을 경우 4바이트 단위로 정렬되는 것을 보실 수가 있습니다.  즉, 4로 나눠떨어지도록 메모리를 더 사용하게 됩니다.  델파이 내에서 통신하는 경우는 상관없지만, 다른 언어와 통신하며 데이터를 주고 받을 때는 이 부분을 유의하셔야 합니다.


[소스 1]

type
  TPacketRecord = record
    Code : byte;
    Data : integer;
  end;

  TPacketObject = object
    Code : byte;
    Data : integer;
  end;

  TPacketPackedRecord = packed record
    Code : byte;
    Data : integer;
  end;

  TPacketPackedObject = object
    Member : TPacketPackedRecord;
  end;

{$R *.dfm}

procedure TfmMain.FormCreate(Sender: TObject);
begin
  moMsg.Lines.Add(Format('Size of TPacketRecord = %d', [SizeOf(TPacketRecord)]));  // 8 bytes
  moMsg.Lines.Add(Format('Size of TPacketObject = %d', [SizeOf(TPacketObject)]));  // 8 bytes
  moMsg.Lines.Add(Format('Size of TPacketPackedRecord = %d', [SizeOf(TPacketPackedRecord)]));  // 5 bytes
  moMsg.Lines.Add(Format('Size of TPacketPackedObject = %d', [SizeOf(TPacketPackedObject)]));  // 5 bytes
end;





관련글 더보기