본문 바로가기
Delphi/클래스

델파이의 클래스 헬퍼(helper)

by MonoSoft 2021. 8. 2.
728x90
반응형

델파이의 클래스 헬퍼(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

 

GitHub - colinj/TDateTimeHelper: Helper record for TDateTime type

Helper record for TDateTime type. Contribute to colinj/TDateTimeHelper development by creating an account on GitHub.

github.com

 

위의 링크를 통해 TDateTimeHelper를 다운로드 받을 수 있습니다

즐코딩하시길..

728x90
반응형

댓글