델파이의 최근 버전에 추가되었지만 개발자들이 잘 모르고 있는 기능들이 꽤 많은데요. 숙련된 델파이 개발자들까지도 델파이 7 이하까지의 문법에만 익숙한 경향이 있습니다. 하지만 구버전 문법으로 구버전처럼 사용한다면 최신 버전을 사용하는 장점이 반감되지 않겠습니까. 그래서, 델파이 개발자들이 잘 모르고 있는 아주 유용한 기능들을 시간이 되는 대로 하나씩 소개해볼까 합니다.
이번에 소개하는 클래스 헬퍼는 델파이 2006에서 추가된 언어 기능으로, 기존의 클래스를 수정하지도 상속하지도 않고 클래스의 기능을 확장할 수 있게 해줍니다. 클래스를 많이 다루는 경력 개발자분들은 이 말만 듣고도 우와~ 할 것 같습니다. 이런 필요가 있는 경우가 꽤 흔하거든요.
클래스 헬퍼 자체도 하나의 클래스입니다. 클래스 헬퍼 클래스(말이 좀 헷갈리네요)에서 선언한 멤버들은 마치 원래의 클래스의 멤버인 것처럼 액세스할 수 있게 됩니다.
실제로도 아주 유용한 아래의 샘플 코드를 살펴봅시다. (delphi.about.com에서 소개된 코드입니다)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
interface uses Classes; type TStringsHelper = class helper for TStrings public function Add(const V: Variant): Integer; overload; function Add(const Args: array of Variant): Integer; overload; end; implementation uses Variants; function TStringsHelper.Add(const Args: array of variant): Integer; var tmp: string; cnt: Integer; begin tmp := ''; for cnt := Low(Args) to High(Args) do tmp := tmp + VarToStr(Args[cnt]) ; result := Add(tmp) ; end; function TStringsHelper.Add(const V: Variant): Integer; begin Result := Add([V]) ; end; end. |
이 클래스 헬퍼를 이용하면, 이제 TStrings (그리고 TStringList 등 상속받은 모든 클래스들)에서 TStrings에 원래 존재하는 기본 Add() 함수 외에 오버로드된 Variant 및 Variant 배열 버전의 Add() 함수들을 호출할 수 있게 됩니다. Variant가 되니까 당연히 정수나 실수 등 대부분의 델파이 기본 타입들을 직접 TStrings 객체의 문자열 아이템으로 추가할 수 있게 됩니다.
1 2 3 4 5 6 7 |
with ListBox1.Items do begin Add('delphi.about.com') ; Add(2008) ; Add(true) ; Add(['Only ', 1, true, ' line']) ; end; |
이와 같이, 클래스 헬퍼를 이용하면 기존의 클래스에 기능을 추가할 수 있습니다. 하지만 자신이 직접 만드는 클래스에 클래스 헬퍼를 사용할 필요는 거의 없을 거고, 주로 위의 TStrings처럼 개발자가 수정하기 곤란한 프레임워크/라이브러리의 클래스들에 기능을 추가해서 사용할 때 많이 활용할 수 있습니다.
클래스 헬퍼로 기존 클래스의 private이나 protected 멤버를 액세스할 수는 없고 오직 public/published 멤버만 액세스할 수 있습니다. 따라서 클래스 헬퍼를 쓴다고 해서 기존에 할 수 없었던 작업을 할 수 있게 되는 것은 아닙니다. 하지만 위의 예제에서 보듯이, 단순 코딩 작업을 많이 줄여주고 코드를 더 간략하게 만들 수 있게 됩니다.
클래스 헬퍼 멋진 기능인데 경험상 주의할 점의 2가지 있더군요. 1. 너무 많이 쓰다보면 아주아주 가끔 Internal Error: 0620이 나온거나, 2. 한 클래스에 클래스헬퍼는 동시에 2개이상 적용되지 못한다는 것입니다(http://whitekid.tistory.com/entry/Class-helper-%EC%82%AC%EC%9A%A9%ED%95%A0%EB%95%8C-%EC%A3%BC%EC%9D%98%EC%A0%90). 2007에 있던 문제인데, 요즘은 어떤지 모르겠네요..
오.. whitekid님의 글도 좋군요. 이미 써놓으신 게 있는 줄 알았으면 시간 들여 쓰지 않고 간단히 소개만 하고 whitekid님의 글을 링크할 걸 그랬습니다. ^^
인터널 에러는 잡힌 것으로 알고 있는데, 원래 인터널 에러 자체가 매번 발생했던 것이 아니라서 확실한지는 모르겠습니다. 그리고 둘 이상의 클래스 헬퍼를 적용할 수 없는 것은 문서화된 스펙의 문제라 당연한 거구요. ^^
헉.. imp님께서 그러시니 몸둘바를 모르겠네요.
QC에 보면 아직 Open이긴한데, 한참 저거 당한 이후로 다시 없는걸로 봐서는 소리소문없이 잡혔나봅니다.
2개이상 적용하는걸 깊이 고민해보진 않아서 모르겠지만, 2개이상 지원하면 정말로 편하겠다는 생각이 듭니다. 그걸 구현하려면 머리아프긴 하겠지만요. ^^;
C++Builder유저로써 Delphi에 부러운것 중 하나가 class-helper인데..
그런데 생각보다 delphi유저들이 별루 쓰지 않는것 같더군요
뭐 C++에 class-helper기능이 없다고 하더라도..
얼마든지 비슷하게 만들수 있지만서두…