델파이의 클래스 헬퍼(helper)
델파이의 최근 버전에 추가되었지만
개발자들이 잘 모르고 있는 기능들이 꽤 많은데요.
숙련된 델파이 개발자들까지도
델파이 7 이하까지의 문법에만 익숙한 경향이 있습니다.
하지만 구버전 문법으로 구버전처럼 사용한다면
최신 버전을 사용하는 장점이 반감되지 않겠습니까.
그래서, 델파이 개발자들이 잘 모르고 있는
아주 유용한 기능들을 시간이 되는 대로 하나씩 소개해볼까 합니다.
이번에 소개하는 클래스 헬퍼는 델파이 2006에서
추가된 언어 기능으로, 기존의 클래스를 수정하지도
상속하지도 않고
클래스의 기능을 확장할 수 있게 해줍니다.
클래스를 많이 다루는 경력 개발자분들은
이 말만 듣고도 우와~ 할 것 같습니다.
이런 필요가 있는 경우가 꽤 흔하거든요.
클래스 헬퍼 자체도 하나의 클래스입니다.
클래스 헬퍼 클래스(말이 좀 헷갈리네요)에서
선언한 멤버들은 마치 원래의 클래스의
멤버인 것처럼 액세스할 수 있게 됩니다.
실제로도 아주 유용한 아래의 샘플 코드를 살펴봅시다.
(delphi.about.com에서 소개된 코드입니다)
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 객체의 문자열
아이템으로 추가할 수 있게 됩니다.
Delphi/Pascal
with ListBox1.Items do
begin
Add('delphi.about.com') ;
Add(2008) ;
Add(true) ;
Add(['Only ', 1, true, ' line']) ;
end;
이와 같이, 클래스 헬퍼를 이용하면
기존의 클래스에 기능을 추가할 수 있습니다.
하지만 자신이 직접 만드는 클래스에 클래스
헬퍼를 사용할 필요는 거의 없을 거고,
주로 위의 TStrings처럼 개발자가 수정하기
곤란한 프레임워크/라이브러리의 클래스들에
기능을 추가해서 사용할 때 많이 활용할 수 있습니다.
클래스 헬퍼로 기존 클래스의 private이나 protected 멤버를
액세스할 수는 없고 오직 public/published 멤버만
액세스할 수 있습니다.
따라서 클래스 헬퍼를 쓴다고 해서 기존에 할 수 없었던
작업을 할 수 있게 되는 것은 아닙니다.
하지만 위의 예제에서 보듯이, 단순 코딩 작업을 많이
줄여주고 코드를 더 간략하게 만들 수 있게 됩니다
자바 버전5부터 오토박싱 개념이 도입되어
기본타입을 마치 객체처럼 사용할 수 있도록
편리한 기능이 도입되었다.
델파이도 비슷한 기능을 제공하는데
아마 XE8부터인가?..
도입시점을 알 수 없지만..
엠바카데로 델파이 위키를 보면 XE3부터 지원되는 듯한데..
(검색해봤으나, 시원히 알려주는 자료를 찾지 못했습니다 ㅠㅠ)
아무튼..
델파이 헬퍼는 class나 record에서 사용가능한데
이 주제는 냅두고.. 기본타입에 대한 헬퍼만 소개하겠다
예전에는
var intValue: Integer;
begin
intValue:= StrToInt('100')
end;
라고 작성했지만 기본타입에 대한
헬퍼덕분에 아래처럼 사용이 가능하다.
intValue:= '100'.ToInteger;
객체를 이용하듯이 기본타입에 메소드를 호출이 가능하다
여기서 기본타입은
int, int64, string, double, extended, extended80등이 있다
TStringHelper만 보자면
class function ToInt64(const S: string): Int64; overload; static; inline;
class function ToSingle(const S: string): Single; overload; static; inline;
class function ToDouble(const S: string): Double; overload; static; inline;
class function ToExtended(const S: string): Extended; overload; static; inline;
class function LowerCase(const S: string): string; overload; static; inline;
class function UpperCase(const S: string): string; overload; static; inline;
등등의 메소드를 제공하며
var
s: String;
begin
'10'.ToDouble 이라던지
s.ToDouble이라던지 사용이 가능하다
end;
별거 아닌것 같지만 사용해보면 행복에 겨운 코딩이 가능하다.
하지만 행복도 잠시
열거형에선 안되며, 심지어 TDateTime도 지원하지 않는다?
열거혈까진 이해하겠지만.. 도대체 왜?? TDateTime은 지원하지 않지?
System유닛에 TDateTime = type Double;
이렇게 정의되서 그런가?
아니 아무리그래도..
고생스럽더라도 TDateTime정도의 헬퍼는 만들어줄수 있잖아??
어차피 DateUtils유닛에 있는 함수를
TDateTimeHelper로 만들면 되지 않을까? 하며
노가다를 시작하려 했는데, 혹시 모르는 검색을 해보니..
역시나 있군요 ㅋㅋ
https://github.com/colinj/TDateTimeHelper
위의 링크를 통해 TDateTimeHelper를 다운로드 받을 수 있습니다
즐코딩하시길..
'Delphi > 클래스' 카테고리의 다른 글
델파이 쓰레드(Thread)의 기초 (0) | 2021.08.07 |
---|---|
델파이 레코드 클래스 성능 비교 (0) | 2021.08.05 |
델파이 TDictionary / TObjectDictionary (0) | 2021.08.04 |
델파이 클래스 메소드 사용방법 (0) | 2021.08.03 |
델파이 쓰레드 사용법 (0) | 2021.05.21 |
댓글