|
델파이 강좌/문서
|
|
Delphi Programming Tutorial&Documents
|
|
[69] 싱글톤 패턴의 응용 |
류종택 [ryujt]
|
6155 읽음 2005-08-03 10:43 |
1 : unit Unit2; 2 : 3 : interface 4 : 5 : uses 6 : SysUtils, Classes; 7 : 8 : type 9 : TDataModule2 = class(TDataModule) 10 : private 11 : { Private declarations } 12 : public 13 : { Public declarations } 14 : Class Function GetObject:TDataModule2; 15 : end; 16 : 17 : implementation 18 : 19 : var 20 : DataModule2 : TDataModule2 = Nil; 21 : 22 : {$R *.dfm} 23 : 24 : { TDataModule2 } 25 : 26 : class function TDataModule2.GetObject: TDataModule2; 27 : begin 28 : If DataModule2 = Nil then DataModule2:= TDataModule2.Create(Nil); 29 : Result:= DataModule2; 30 : end; 31 : 32 : end.
19라인에서 보시듯이 원래 이 변수 선언 부분은 implementation 위에 있었던 것입니다. 이것을 지역변수로 변경하여 외부에서 집적접근하는 것을 막았습니다. 싱글톤은 해당 어플리케이선(프로젝트) 내에서 유일한 하나의 객체임을 보증하기 위한 방법입니다.
전역변수를 사용하는 것보다는 휠씬 코드 내의 위험성이 작아지는 장점이 있습니다. 예를 들어서 가끔 객체가 생성되기도 전에 호출해서 생기는 Access Violation에러를 방지할 수 있습니다. 주로 초보자에게서 많이 발생하는 실수 중에서 Main Form의 OnCreate 이벤트에서 데이터모듈(TDataModule)을 접근하는 경우 데이터모듈이 메인폼보다 늦게 생성되어 Access Violation를 발생합니다. 이때 위의 소스처럼 데이터모듈의 소스를 변경하시고 메인폼의 OnCreate에서 아래처럼 사용하시면 됩니다.
1 : unit Unit1; 2 : 3 : interface 4 : 5 : uses 6 : Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 : Dialogs; 8 : 9 : type 10 : TForm1 = class(TForm) 11 : procedure FormCreate(Sender: TObject); 12 : private 13 : { Private declarations } 14 : public 15 : { Public declarations } 16 : end; 17 : 18 : var 19 : Form1: TForm1; 20 : 21 : implementation 22 : 23 : uses 24 : Unit2; 25 : 26 : {$R *.dfm} 27 : 28 : procedure TForm1.FormCreate(Sender: TObject); 29 : begin 30 : TDataModule2.GetObject.Name:= 'Test'; 31 : end; 32 : 33 : end.
싱글톤을 사용하면 객체가 두번 이상 생성되는 실수도 자동적으로 방어하게 됩니다. 가끔 초보자가 아래와 같이 실수하는 경우를 많이 보게 됩니다.
1 : procedure TForm1.FormCreate(Sender: TObject); 2 : begin 3 : DataModule2:= TDataModule2.Create; 4 : DataModule2.Name:= 'Test'; 5 : end; 6 : 7 : procedure TForm1.Button1Click(Sender: TObject); 8 : begin 9 : DataModule2:= TDataModule2.Create; 10 : DataModule2.Name:= 'Test 2'; 11 : end;
물론 위의 예제처럼 바로 인접한 곳에서 사용하는 경우라면 실수하지 않겠지만, 해당 데이터모듈을 전혀 다른 두곳에서 호출할 때 간혹 이를 실수하여 두번 이상 생성하는 경우가 생깁니다. 또한, 여러 사람이 각자 작성하는 소스에서 사용하고 있는 공유 모듈이라면 더욱 실수하기가 쉬워질 것입니다.
| |