귀하는 손님 이십니다
로그인
회원가입
  
  델마당 공식 은행계좌
  하나은행 227-910235-83607
  예금주 이상국(운영진)
프로젝트 게시판
투표게시판
델마당소개
기초부터 활용까지! 델파이 교육 - 데브기어
 광고문의 :
시리즈 강좌 시리즈 강좌 입니다.
글내용 - 시리즈 강좌
 델파이 디자인패턴 강좌 - 팩토리 메서드(FactoryMethod) 패턴
챨리브라운
(권광일)
2019-04-28 오후 11:42:22
252회 조회


첨부파일 다운로드
FactoryMethod.zip

오늘은 디자인 패턴중에 객체생성을 담당하는 패턴 중 기본이 되면서도 가장 많이 활용되는

팩토리 메서드(Factory Method) 패턴에 대해 알아보자.

기본이 되는 패턴이라고는 하지만, 개념을 제대로 아는 사람들이 더물어 블로그나 유튜브 같은곳에서

잘못된 강좌를 올려놓은 사람들이 허다하다.

아뭏든 팩토리 메서드에 대해 지금부터 상세히 설명하겠다.

 

먼저 용어정리 부터 하자.

팩토리 메서드는 = 팩토리 + 메서드 의 합성어 인데, 여기서 말하는

팩토리(Factory) 란 말을 공장이란 의미로 이해하는 사람들이 많은데 , 패턴강좌에서는 공장이란 말대신

"어떤 클래스의 객체를 대신 생성해 주는 특수한 클래스" 라고 알고 있기 바란다.

메서드는 말그대로 그 특수한 클래스의 메서드를 의미한다.

우리는 이 멤버 메서드를 호출하여 클래스의 객체를 가져올 것이다. 자세한 내용은 이따가 보고,

이런 연유로 팩토리 메서드란 말이 나온 것이다.

 

팩토리 메서드는 이해하기 위해서는 다음의 코드를 보아야 한다.

다음의 코드에서 유심히 보아야 할 것은 abstract 가 붙어 있는 클래스의 생성자이다.

   TObj = class
   public
     Constructor Create; Virtual; Abstract;
   end;

이 클래스 TObj.Create 와 같은 방식으로 객체를 생성 할 수 없다. 그이유는 생성자에

Abstract 추상화 지시어가 붙어 있기 때문이다. 패턴강좌를 볼 정도면 추상화에 대해

어느정도 아시겠지만, 이 지시어가 붙게 되면 메서드 정의만 할뿐 구현은 하위클래스에서

하여야 한다는 원칙이 적용된다.

다시말해 이 클래스를 써 먹으려면 다른 클래스가 필요하다는 얘기가 된다.

그래서 이 클래스를 써 먹을 수 있는 다른 클래스 하나를 만들자.

   TFactoryObj = class(TObj)
   private
     constructor Create;override;
   public
     class function GetObj : TObj;//얘가 바로 Factory Method 다. 객체를 생성해서 리턴한다.
   end;

위 클래스의 역활은 TObj 객체를 생성시켜 GetObj 의 반환값으로 돌려 주는 역활 밖에는 하지 않는다.

Abstract 인 TObj.Create 를 직접구현하기 위해 override 를 사용했다. 이것을 전문용어로 ConCreate 라 한다.

GetObj 앞에 class (Static Method) 를 붙인 이유는 클래스 객체 생성을 위해 또하나의 클래스 객체를

생성한다는 것이 상당히 무의미한 일이기 때문이다. class 를 붙이게 되면 객체생성 과정을 생략 할 수 있다.

 

지금까지의 내용이 팩토리 메서드의 핵심형태이다. 이 이상도 이하도 없다. 이렇게만 보면 정말 간단한것

같은데 이걸 이 개념을 잘못 파악하는 있는 사람들이 태반인 것이 실화다.

 

다시정리하자면, 어떤 클래스(TObj) 가 있는데, 이 클래스의 생성자가 Abstract 라는 이유 때문에

TObj.Create 와 같은 방식으로 객체를 직접 생성 할 수 없다. 해서 객체를 대신 생성해주는 클래스를

만든후 그 클래스의 메서드에 객체를 생성해 달라고 요청해야 하는데, 그 요청을 처리해 주는 녀석이

바로 Factory Method 란 얘기다.

 

Factory Method 에 대한 구조파악은 이쯤에서 잘 되었으리라 본다.

 

그런데 이딴 짓을 왜 하는 것일까? 클래스를 직접 생성해서 쓰면 되지 왜 팩토리 메서드란 개념을 두어

객체를 생성해야 하는 것일까? 다음과 같은 이유를 들수 있겠다.

 

1. 객체의 캡슐화

   객체의 캡슐화란 말은 쉽게 말해 객체를 은닉시키는 것이다. 클래스를 객체화 해서 사용하는

   사용자에게 객체가 어떤식으로 생성되는지 굳이 알리고 싶지 않을 때가 있다. 아니 알필요가

   없으니 신경쓰지 말라고 하고플 때가 있다. 이런 경우  최종적으로 생성된 객채만을 넘겨주는 형식을

   취하므로써 은닉성을 가질 수 있다.

 

2. 싱글톤의 개념처럼 객체의 생성을 사용자의 편의에 맞겨서는 안되는 경우가 있다.

   예를 들어 프로그램내에서는 TObj 의 객체가 딱 5개까지만 생성이 허용되어야 한다고 가정하면

   TObj.Create 를 막 사용하게 되면 객체의 생성이 무분별하게 되어 어떤 문제가 초래될 수도 있기

   때문이다. 이런경우 팩토리 메서드가 객체의 생성을 통제하는 역활을 할 수 있다.

 

3. TObj 의 생성자의 매개변수의 형태나 갯수가 바뀌면 TObj 를 가져다 쓰는 하위 클래스의 모조리 바꿔야

   하는 불편함이 있다. 이런경우 팩토리를 사용하면 어느정도 수고를 들 수 있다.

 

이상으로 팩토리 메서드에 대해 알아 보았다. 예제소스를 만들어서 첨부해 두었으니,

예제를 보면서 좀 더 확실히 자기 것으로 만들기를 바란다.