Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 강좌/문서
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;

물론 위의 예제처럼 바로 인접한 곳에서 사용하는 경우라면 실수하지 않겠지만,
해당 데이터모듈을 전혀 다른 두곳에서 호출할 때 간혹 이를 실수하여 두번 이상 생성하는 경우가 생깁니다.
또한, 여러 사람이 각자 작성하는 소스에서 사용하고 있는 공유 모듈이라면 더욱 실수하기가 쉬워질 것입니다.


+ -

관련 글 리스트
69 싱글톤 패턴의 응용 류종택 6155 2005/08/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.