Download VCard

© 최병일 1981-‘10

객체 지향 소프트웨어 일주 - 3

작성자: yagur Rev : 1

 Around Object Oriented Software - 3

 다형성(Polymorphism)

  Poly는 '많은(多)'이란 뜻을 가지고 있고 morph는 '형(形)'이란 뜻을 가지고 있다. polymorph는 다형으로 번역되고 있으며 polymorphism은 다형성을 뜻하고 있다. 다형성이란 무엇일까? 다수의 형을 가진 성질이라고 해석하면 되지만 다수의 형을 갖는것이 어떤 것인지는 예를 보기전엔 알기 어려운 단어이다.

사용자 삽입 이미지
미녀와 야수

  미녀와 야수에서 야수는 저주에 걸린 왕자이다. '그'는 저주를 받은 인간으로 야수의 모습을 하게 되었다. 우리가 소설속 남자 주인공을 지칭하는 '왕자'란 추상적 객체는 시간에 따라 여러 가지 형을 지니게 된다. 저주 받기 전인 과거에는 인간으로서 '왕자'였고, 저주 받은 상태의 현재엔 야수의 형태를 지닌 '왕자'이다. 또 공주를 만나 시간이 흐른 미래에는, 저주가 풀리면서 다시 인간의 형태를 지닌 '왕자'가 된다.
  컴퓨터 언어의 코드 플로우에도 과거와 현재, 그리고 미래를 지니고 있다. 그리고 '그'(왕자)를 코드로 재미 삼아 표현해 본다.

미녀와 야수 코드 샘플
Queen* pQueen = g_pActorFactory->CreateQueen();
King* pKing = g_pActorFactory->CreateKing();
Prince* pPrince = pKing->CreateBabyWith(pQueen); // Birth of the prince

Actor* pHe = pPrince;
pHe->LiveLifeFor("SomeYears"); // #1

Wizard* pWizard = g_pActorFactory->CreateWizard();
MagicSpell* pMagicSpell = pWizard->CreateMagicSpell("MetamorphToBeast");

pHe = pMagicSpell->CastTo(pHe); // cursed
pHe->LiveLifeFor("SomeYears");   // #2

Princess* pPrincess = g_pActorFactory->CreatePrincess();
MagicEffect* pUndoEffect = pPrincess->CreateMagicEffect("Kiss");

pHe = pUndoEffect->AffectTo(pHe); // Princess kisses the prince.
pPricess->Speaks("I love you");
pHe->Speaks("Will you marry me?"); // #3

Priest* pPriest = g_pActorFactory->CreatePriest();
pPriest->AnnounceMarriage(pHe, pPrincess); // Marriage between the princess and prince.
Life* pLifeProcess = g_pLifeFactory->CreateHappilyEverAfter();
pLifeProcess->Add(pHe);
pLifeProcess->Add(pPrincess);

 #1에서 그(' pHe ')는 인간이다.
 #2에서 그는 야수이다.
 #3에서 그는 인간이다.

  pHe 개체의 객체인 Actor는 프로그램의 흐름에 따라 다형성을 지니는 것을 알수 있다. 역활의 추상화Abstraction으로 만들어진 Actor 객체는 대부분의 역활을 지칭하는데 쓰일수 있으며, 다형성을 지니고 있다. 이것이 주는 이점중 하나는 은닉Encapsulation이다. 사용자는 실체가 무엇인지 몰라도 추상 객체를 통해 흐름을 진행시킬수 있다. 위와 같이 추상화를 통해 실현된 다형성은 상속을 기반으로 한것이다.


 행위 기반 다형성(Behavior based polymorphism)

  정적 타입 언어는 상속 관계를 통한 다형성을 구현하지만 다른 방식의 다형성도 존재한다. 행위만 동일하다면 관계에 상관없이 다형성을 지니게 되는 경우이다. 이 행위 기반 다형성은 동적 타입 언어와 정적 타입 언어에서 모두 나타나지만 차이점이 존재한다. 그 차이점은 언제 다형성을 지니는것인가 이다.
  정적 타입 언어의 특징상 행위 기반 다형성을 컴파일 타임에 템플릿을 통해 지원한다. 동적 타입 언어는 형 변경의 제약이 없기 때문에 실행시간에 해당 다형성을 지원하고 있다. 동적 타입 언어에서 실현되는 행위 기반 다형성을 Duck-typing이라고 한다.
사용자 삽입 이미지
오리처럼 걷고, 오리처럼 소리낸다면, 난 그것을 오리라 부르겠다.
아래는 python의 duck-typing 예이다.

more..

  하지만 Duck-Typing 역시 약속된 행위를 객체가 지니고 있어야 다형성을 지닐수 있다. 상속을 배제하고 행위를 런타임중에 확인할수 있는 언어의 특징상 생긴 기능이라 볼수 있다. 이는 정적 언어와의 성능차이로 이어진다. 양쪽 타이핑 모두 일장일단을 지니고 있다.
 C++에서 duck typing과 상속의 차이는 C++의 정적 타입 시스템 때문에 생긴다. 그리고 우리는 C++ 프로그램이 빠르게 동작하것으로 그 비용의 일부를 지불하고 있다.
- Andrew Koenig and Barbara E. Moo(AT&T)

  이렇듯 여러 객체 지향 언어에서 다형성은 매우 중요한 추상화의 실제 장점으로 여겨지고 있다. 현제 객체지향 패러다임은 추상화를 매우 중요히 다루고 있다. 다형성은 모듈화와 재사용성에 큰 영향을 미치고 있으며 필수 테크닉이 되었다.

'개발 > 수필' 카테고리의 다른 글

객체 지향 소프트웨어 일주 - 5  (0) 2008/05/18
객체 지향 소프트웨어 일주 - 4  (0) 2008/05/08
객체 지향 소프트웨어 일주 - 3  (0) 2008/03/28
테스트와 장인 - 8  (0) 2008/03/19
객체 지향 소프트웨어 일주 - 2  (2) 2008/03/15
테스트와 장인 - 7  (0) 2008/03/12
Comment 0 Trackback 0

Trackback : http://yagur.impon.net/trackback/134 관련글 쓰기

Top

prev 1 ... 10 11 12 13 14 15 16 17 18 ... 81 next