터보 파스칼 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;
64비트에서 WSAAccept 오동작 문제 (0) | 2012.06.29 |
---|---|
Same origin policy 때문에 다른 포트로 jQuery에서 get이나 post를 할 수 없을 때 (0) | 2012.05.22 |
비트 모아 기가 바이트 (3) | 2012.03.26 |
변칙으로 사용하는 TDD (0) | 2011.07.01 |
2008.03.29 - Flex & Delphi : 채팅 프로그램 만들기 (2) | 2011.06.02 |