본문 바로가기

프로그래밍/디자인패턴

[디자인패턴] 디자인 패턴 포스트를 시작하면서 & 디자인 패턴에 대해



디자인 패턴 스터디를 어제부로 시작했습니다. 


OpenCV나, 셰이딩 입문이나 벌여놓은 건 많은데 괜히 또 일벌이는거 아닌가 싶지만, ...

스터디 기회는 흔치 않으니까요.


현재로써는 23개의 패턴을 모두 포스팅 할 계획입니다.

포스팅 잘해놓으신 다른 분들도 많은데 나도 굳이 해야할까? 이런 생각도 들지만 해놓으면 (저에게) 도움이 될 거라 생각합니다.






우리는 조금 더 유연하고 편리한 프로그래밍을 위해 프레임 워크, 라이브러리등을 사용합니다. 프로그래밍시 상황에 따라 이런 적절한 도구를 사용하는 것은 매우 중요한 능력입니다. 


꽤 괜찮은 도구가 있음에도 이를 활용하지 않는 것은 시간과 비용의 낭비입니다. 하지만 이 도구를 적재적소에 활용하지 못하는 것 또한 낭비겠지요. 때문에 우리는 도구를 잘~ 사용하기 위해 도구의 정확한 용도, 장단점, 핵심 특성, 주의 사항 등을 제대로 파악해 사용해야 합니다.


( 이것이 제가 패턴에 대해 포스팅할 때 활용하고 싶은 목차인데요. 매 번 잘 지켜질지는 장담이 ... )


프레임 워크, 라이브러리, 디자인 패턴 같은 도구들을 활용하면 적은 시간과 힘으로 원하는 것을 만들 수 있습니다. 


디자인 패턴이란 프로그램 개발 과정에서 빈번하게 발생하는 디자인. 설계. 구조. 상의 문제를 잘 정리해 상황에 따라 간편히 적용해 쓸 수 있게 만들어 놓은 패턴입니다. 


위에서 말했듯 모든 도구는 용도에 맞게 사용했을 때 제 힘을 발휘하게 됩니다. 엉뚱한 곳에 잘못사용하면 오히려이 될 수 있지요. 


프로그래밍시 직접 사용해보면서 하면 디자인 패턴을 현명하게 활용하는 방법을 알 수 있을 것입니다.



Head First 에는 처음에 세가지 디자인 원칙이 나옵니다. 


첫 번째는 달라지는 부분을 찾고, 달라지지 않는 부분으로부터 분리해 캡슐화 한다는 것입니다.

새로운 요구사항이 있을 때마다 바뀌는 부분이 있다면 그 부분만 따로 캡슐화시킵니다. 이렇게 하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않은 채로 그 부분만 확장하거나 고칠 수 있습니다.


이 개념은 간단하지만 모든 디자인 패턴의 기반을 이루는 원칙입니다. 모든 패턴은 시스템의 일 부분을 다른 부분과 독립적으로 변화시킬 수 있는 방법을 제공하기 위한 것이기 때문이죠.


두 번째는 구현이 아닌 인터페이스에 맞춰 프로그래밍한다.

이런 식으로 디자인하면 다른 형식의 객체에서 인터페이싱한 메소드를 활용할 수 있습니다. 


세 번째는 상속보다는 포함을 활용하는 것입니다.

포함을 사용하면 시스템의 유연성을 크게 향상시킬 수 있습니다.




패턴은 GoF가 정의한 목적에 따라 3가지로 나뉩니다.


1. 생성패턴 (Creational Pattens)


 유연한 방법으로 객체의 집합을 생성하는 패턴으로 객체를 생성하고 참조하는 과정을 추상화하여, 객체의 생성과 조합 등에 구애받지 않고 프로그래밍할 수 있게 해줍니다. 즉, 특정 객체가 생성되거나 변경되도 전체 시스템의 변화는 최소로 만들어 시스템의 확장 혹은 유지보수에 최소비용이 들도록 만들어줍니다.


시스템 상에서 사용되는 객체의 변화에 따라 관련된 모듈이 의존적으로 동작하게 되는데 이 부분을 비 의존적으로 만든다면 시스템의 유지보수에 도움이 됩니다.


생성패턴의 종류에는 추상 팩토리, 빌더, 팩토리 메소드, 프로토타입, 싱글톤이 있습니다.



2. 구조패턴 (Structural Pattens)


변하는 부분과 변하지 않는 부분을 나누어 클래스를 설계하는 방법을 제시합니다.


구조패턴에는 어뎁터, 브릿지, 컴포지션, 데코레이터, 퍼사드, 플라이급, 프록시가 있습니다.



3. 행위패턴 (Behavioral Pattens)


객체나 클래스 간의 교류 방법에 대해 정의하는 방법을 제시합니다. 런타임시 수행하기 어려운 복잡한 제어구조를 패턴화시킨 것으로 이를 사용하면 객체들 간의 제어구조보다 객체들을 어떻게 연결시킬 것인가에 더 중점을 두게됩니다. 객체들 사이의 행위나 알고리즘 등과 관련된 패턴으로 응용 분야에 따라 행위가 다른 객체로 옮겨가거나 알고리즘이 대체되는 경우가 존재할 때 사용합니다.


행위패턴에는 역할 사슬, 커멘드, 인터프리터, 이터레이터, 미디에이터, 메멘토, 옵저버, 상태, 전략, 템플릿 메소드, 비지터가 있습니다.




그럼 이제 디자인 패턴들에 대해 시작할게요^^!