본문 바로가기

Academy I/Tech Academy

[Delphi]Spring4d 강좌 1 (객체 자동 파괴)

Spring4d 사이트 주소 :  https://bitbucket.org/sglienke/spring4d

Spring4d는 자바의 Spring 기능을 델파이에서도 사용할 수 있도록 하기 위해 만든 라이브러리다. 이 라이브러리를 만든 사람은 정말 천재다. 이 기막힌 라이브러리의 몇가지 유용한 기능을 소개하고자 한다. 

예전에 객체 자동 파괴에 관한 글을 올렸던 적이 있는데, 그당시 자동파괴보다 명시적인 파괴가 더 낫다라고 하는 사람들이 있었다. 절대로 그렇지 않다. 자동 파괴는 현대 개발 언어에서 매우 중요한 부분으로 자바, 닷넷 등 최근 언어들은 기본적으로 지원하는 기능이다. 

자동 파괴가 왜 중요한가하면, 소스 한줄을 줄이면 디버깅할 게 하나 줄어든다는 이론 때문이다. 이말인즉 프로그램 소스는 짧을 수록 디버깅할 게 적다는 것이다. 

우리가 아는 대다수 언어기능들, 예를 들면, 함수지향, 객체지향, Lambda, 익명함수, LINQ 등이 사실 소스 줄이기를 위한 방법들이다. 

델파이는 기본적으로 Owner 메커니즘으로 자동 파괴를 지원하지만, Owner 메커니즘을 사용하려면 그 객체의 클래스는 반드시 TComponent로 부터 상속을 받아야 한다. 

그렇다면 TComponent로 부터 상속받지 않은 클래스 객체의 자동 파괴는 어떻게 해야 할까? 과거에는 여기에 대한 해법이 없었지만, 최근 델파이에 Generic 기능과 Record문법이 강화되면서, XE2 이상에서는 드디어 일반 객체도 자동 파괴가 가능하게 되었다. 

Spring4d를 사용하면 그 방법은 매우 간단하다. 

대략 다음과 같다.

uses Spring; // uses문에 Spring 추가

// 다음과 같은 TMyObject가 있다고 가정하면

type
  TMyObject = class(TObject)
  public
    public field1 : String;
    constructor Create;
    destructor Destroy; override;
  end;

다음과 같이 자동 파괴를 구현할 수 있다.

var
  obj : Managed<TMyObject>; // Managed generic 레코드 생성
begin
  obj := TMyObject.Create; // Managed generic에 객체 생성해서 대입
  // 실제 TMyObject 멤버값을 참조하는 두가지 방법
  // 아래 라인 두가지 모두 동일함 
  obj.Value.field1 := 'aaaa';
  TMyObject(obj).field1 := 'aaaa';
  // 이 시점에 자동으로 파괴된다.
end;

Spring4d의 버전에 따라서 Managed<> 대신에 Owned<> 를 사용해야 할 수도 있다. 아마도 최근 버전이 Managed를 사용하는 것 같다. 

함수의 로칼 변수로 Managed<T> 객체를 정의하면 속한 함수 리턴 직전에, 다른 클래스의 멤버로 정의했다면 그 클래스 객체가 파괴될 때 자동 파괴된다. 따라서 이를 이용하면 어떤 클래스가 다른 클래스의 객체를 내포하는 경우, 자동 파괴를 매우 쉽게 구현할 수 있다.

TInner = class
  //
end;

TOuter = class
  inner : Managed<TInner>; 
  constructor Create;
end;

constructor TOuter.Create;
begin
  inherited;
  inner := TInner.Create;
end;

위와 같이 TInner과 TOuter 클래스를 정의했다면 다음과 같은 코딩이 가능하다. 

var
 outer : Managed<TOuter>;
begin
  outer := TOuter.Create;
  
  // outer 객체 사용 

  // 이 시점에서 모든 객체들이 자동 파괴 됨   
end;

델파이 매뉴얼을 보면 객체를 생성하고 파괴할 때 try finally end 블럭으로 처리하라고 되어 있다. Managed를 사용하면 그럴 필요가 없다. 반드시 자동 파괴해 주기 때문이다. 

Spring4d는 Source 폴더 아래에 여러 하위 폴더에 소스 파일들이 분산되어 있다. Spring4d 라이브러리를 편하게 사용하려면 모든 소스를 한 폴더에 몰아 두고, 델파이 옵션의 Library 설정에서 그 경로를 지정하는 것이 편하다.



[출처 : https://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&indx=452236&page=2]