달력

05

« 2018/05 »

  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  

'C#'에 해당되는 글 3

  1. 2016.06.30 Template Method Pattern
  2. 2016.06.07 Adapter Pattern (2)
  3. 2016.05.04 Iterator Pattern
2016.06.30 14:16

Template Method Pattern 프로그래밍/디자인패턴2016.06.30 14:16




Template Method Pattern 에 대해서 알아보도록 하겠습니다.


이 패턴을 설명하면 다음과 같습니다.


추상 클래스를 구현하고,

그 클래스를 사용하여 [기능]을 실행합니다.


하지만, 그 [기능]구현은 추상 클래스를 상속받은 구현 클래스에서 구현합니다.



설명만 들으면 아리송 한 관계로 예제를 보도록하겠습니다.





코드를 보면, 

SportClass라는 추상 클래스를 만들고,


BaseBall Class, Soccer Class가 각각 SportClass를 상속받은 구현 클래스 입니다.


기본적으로 어떤 시점에 SportClass에서 Play를 실행시키게 되지만,


실제로 사용되는 role(기능) 은 각각의 구현 클래스가 따로 구현을 하게 됩니다.



UML로 보면 Template Method Pattern은 다음과 같은 형태를 가지게 됩니다.

Method는 새로 구현하지만,

template Method는 Override 하지 않고, 추상클래스가 가지고 있는 그대로를 사용하게 됩니다.


책에서는 해당 패턴에 대해서 다음과 같은 팁을 제공하고 있습니다.

1. 로직 공통화(장점)

 - 모든 스포츠는 Play를 할 수 있다.

2. 상위 클래스와 하위 클래스의 연계(약간의 단점)

 - Play를 언제 호출 할지, Play의 내부에서 언제 role을 호출 하는지 구현 클래스를 작업하기 위해서는 알고 있어야 한다. )

3. 하위 클래스를 상위 클래스와 동일시한다.(주의점)

 - 해당 패턴만의 이야기는 아닙니다만, 추상 클래스(스포츠)형 변수에 하위 클래스의 어떤 인스턴스(야구든, 축구든, 또는 다른 새로운 스포츠든...)를 대입해도 제대로 작동할 수 있도록 해야 합니다.


 마지막으로, 모든 패턴들은 상위, 하위 클래스들의 조합으로 이루어진 패턴이 대다수 입니다.

해당 부분에 있어, 

상위 클래스에서 대부분을 구현하게 되면, 하위 클래스의 자율성이 떨어지고,

상위 클래스에서 기술을 적게 하면 하위 클래스의 기술이 어렵거나, 중복 처리 해야 하는 부분이 증가할 것 입니다.


중요한 것은 상위 클래스에 어떤 것을 두고,

어떤 처리를 하위 클래스에 둘 것인지를 정한 매뉴얼은 없습니다.

그것은 프로그램을 설계하는 사람의 몫이라고 합니다.


다음은 Factory Method Pattern에 대해서 알아보도록 하겠습니다. 

'프로그래밍 > 디자인패턴' 카테고리의 다른 글

Factory Mathod Pattern  (0) 2017.04.12
Template Method Pattern  (0) 2016.06.30
Adapter Pattern  (2) 2016.06.07
Iterator Pattern  (0) 2016.05.04
UML의 기본 구성-시퀀스 다이어그램  (4) 2016.05.02
UML의 기본 구성-클래스 다이어그램  (0) 2016.05.02
Posted by 안식의후크
2016.06.07 16:33

Adapter Pattern 프로그래밍/디자인패턴2016.06.07 16:33




Adapter Pattern에 대해사 알아 보도록 하겠습니다.


해당 패턴을 알아 보기전에 한가지 문제점에 대해서 먼저 알고 넘어가야 합니다.


[상황]

1. [인사]를 출력하는 클래스가 존재


[추가 할 내용]

1. [닉네임]을 추가로 출력 필요

2. [닉네임]을 먼저 출력 하거나, 인사를 먼저 출력 할 수 있음


물론 [인사]를 출력하는 부분에서 [닉네임]을 받아서 함께 처리 하여도 됩니다.


하지만, 


기존의 코드를 수정하고 싶지 않을 경우, 또는 하지 못하는 경우에 다음과 같은 방법을 사용합니다.


먼저 해당 부분은 2가지 방법이 존재하는데 


interface 를 사용하는 상속으로만 해결 하는 방법과,

상속, 위임(포함)을 통한 방법이 있습니다.


물론 2가지 모두 Adapter Pattern 입니다.


코드를 확인하도록 하겠습니다. 


StringPrint라는 interface를 추가로 제작해서 기존의 기능을 두면서 원하는 기능을 추가하였습니다.


현재 단계에서는 interface를 사용하든 확장된 클래스를 사용 하던 큰 차이는 없으나,

사용자에게 좀더 명확함을 주기 위해서 interface를 사용하는 것을 추천합니다.


그리고 두번째 방법으로 

상속, 위임을 통한 방법에 대해서 알아 보도록 하겠습니다. 


이렇게 Adapter Pattern을 사용해서 문제를 해결하는 방법에 대해서 알아 보았습니다. 


Adapter Pattern에 대해서 정의를 내리면 책에서는 다음과 같이 이야기 합니다. 


- Wrapper(감싸는) Pattern 이라고도 함 

- 이미 작동 하고 있는 ( 문제가 없는, 충분히 테스트된 ) 코드를 수정하지 않고, 개조하기 위해서 사용.

- 구 버전과의 호환성을 제공 할 수 있음.


마지막으로 용어 적인 부분과 다이어 그램을 확인 하고 Adapter Pattern은 마무리 짓도록 하겠습니다.


용어적인 부분

- Target( 예제 코드의 Interface [StringPrint]나, 가상 클래스인 [StringPrint] class )

- Client( Main 실행 코드, 예제 코드의 [AdapterClass] class )

- Adaptee( 예제 코드의 [HelloPrint] class  )

- Adapter( 예제 코드의 [NamePrint] class )


다이어그램으로 표현

인터페이스를 사용한 Adapter Pattern


위임(포함)을 사용한 Adapter Pattern



다음은 Template Method Pattern 에 대해서 알아 보도록 하겠습니다.


'프로그래밍 > 디자인패턴' 카테고리의 다른 글

Factory Mathod Pattern  (0) 2017.04.12
Template Method Pattern  (0) 2016.06.30
Adapter Pattern  (2) 2016.06.07
Iterator Pattern  (0) 2016.05.04
UML의 기본 구성-시퀀스 다이어그램  (4) 2016.05.02
UML의 기본 구성-클래스 다이어그램  (0) 2016.05.02
Posted by 안식의후크
2016.05.04 16:55

Iterator Pattern 프로그래밍/디자인패턴2016.05.04 16:55





이번에는 Iterator 패턴에 대해 알아보고, 

해당 부분을 적용한 Unity 예제와, 조금의 응용을 같이 진행에 보도록 하겠습니다. 


흔히 Iterator라 함은, 구지 디자인 패턴의 종류라기보단 컨테니어들을 따라갈때 많이 쓰던 키워드 중 하나? 정도로 많이 파악이 되어 있습니다. 실제로 그것과 크게 다르지도 않습니다.


중요한 것은, 특정 List나 Arr등 그룹지어져 있는 Object들을 순차적( 구현에 따라선 특정 구간이 될 수도... )으로 순회하면서 찾는다는 것이 중요합니다. 단지 이것을 디자인 패턴으로 표현 하였을 때 어떤식의 장점이 있는지, 그리고 어떤식으로 구현해야 하는지 확인해 본다고 보시면 될 것 같습니다.


먼저 최종 사용 코드부터 보도록 하겠습니다. 


사용 코드 예제



(*사용 구현에 대해서는 주관적인 부분입니다.)


코드를 보면 BookShelf에 Book이라는 Class를 넣어 주고, BookShelfIterator를 사용하여 순회 합니다.

그럼 다음으로 실제로 저장 될( 서가에 들어갈 ) Book Class를 보도록 하겠습니다.


아직 Iterator Pattern에서 어떤 처리를 하는지는 설명하지 않았으나,

원하는 결과는 다음과 같을 것입니다.


GameObecjt를 2개 추가하여, 각각 Script를 지정합니다.


Iterator Pattern 을 넣고


국어책도 한권 넣어서 실행하면,

국어책을 책장에 넣고, 책장을 순회하여 어떤 책이 있는지 확인해 볼 수 있습니다.


책의 갯수를 조금 더 늘려 보도록 하겠습니다. 




3권을 더 추가하였습니다.


각각의 책을 서가에 넣고,


서가을 순회하면서 모든 책들을 찾아 보았습니다.


그럼 이제 실제 패턴에 구현 부분을 확인해 보도록 하겠습니다. 



코드를 보면 BookShelf(서가)클래스 안에 Book(책)을 담을 수 있어야 하고.

서가에 iterator를 통해 서가을 검색, 순차적으로 접근 할 수 있어야 합니다.

그런 실제 iterator를 구현한 클래스가 BookShelfIiterator class 입니다.


여기 까지가 iterator pattern의 기본 예제였습니다.



여기서 조금 응용을 해보겠습니다.


* 만약 기존의 책이 아닌 사진을 저장해 놓은 앨범이라는 새로운 서적이 추가되었다. 그렇다면 여기서 어떻게 진행해야 할까?


첫번째로 앨범 전용 서가를 하나 추가할 수도 있을 것이고,

Book Class 처럼 Album이라는 class를 새로 만들 수도 있을 것입니다. 

Iterator도 Album 전용 Iterator가 생성 될 수도 있고, 기존의 Iterator를 활용하여 진행 할 수도 있을 것입니다. 


저는 해당 문제를 기존의 Iterator Pattern을 그대로 두면서 Book Class를 활용하는 방법으로 진행하도록 하겠습니다. 


다른 부분은 다 그대로 두고 Album 이라는 class를 추가 해 보도록 하겠습니다. 


Book Class를 상속받아서 편하게 추가해 보았습니다. 

하지만 꼭 이 방법만이 있는것은 아니겠죠.

 


이런식으로 접근해서 해결 하였지만,



이런 방법도 있을 수 있을 것 같습니다.

(하지만 이렇게 하면 BookShelf 에서 더 코드변경이 일어날지도 모르겠네요)



조금 복잡 할 수도 있으나 Iterator Pattern을 쓰는 이유는 아마 이런 이유가 아닐까 싶습니다.


새로운 무언가( Obecjt, Class ... ) 가 추가 되었을 때 기존의 검색 체계에서 벗어나지 않게 쉽게 추가 할 수 있기 위해서라고 생각합니다. 


즉, 구현에 상관 없이 Iterator를 사용할 수 있기 때문.


Alnum을 추가 하고 실행하면 다음과 같이 표현됩니다.




이상으로 Iterator Pattern에 대한 설명을 마칩니다. 많이 부족하지만, 점점 나아질 것이라 생각합니다.

'프로그래밍 > 디자인패턴' 카테고리의 다른 글

Template Method Pattern  (0) 2016.06.30
Adapter Pattern  (2) 2016.06.07
Iterator Pattern  (0) 2016.05.04
UML의 기본 구성-시퀀스 다이어그램  (4) 2016.05.02
UML의 기본 구성-클래스 다이어그램  (0) 2016.05.02
다시 시작하는 디자인패턴  (0) 2016.04.29
Posted by 안식의후크