디자인패턴

디자인 패턴(Design pattern)이란???

hik14 2024. 5. 28. 05:31

디자인 패턴이란 무엇인가??

객체 지향 프로그래밍 설계를 할 때 자주 발생하는 문제들을 피하기 위해 사용되는 패턴.
여러 사람이 협업해서 개발할 때 다른 사람이 작성한 코드, 기존에 존재하는 코드를 이해하는 것은 어렵다. 이런 코드를 수정하거나 새로운 기능을 추가해야 하는데 의도치 않은 결과나 버그를 발생시키기 쉽고 성능을 최적화시키기도 어렵다. 이로 인해 시간과 예산이 소모된다.

디자인 패턴은 의사소통 수단의 일종으로서 이런 문제를 해결해준다. 예를 들어 문제 해결의 제안에 있어서도 “기능마다 별도의 클래스를 만들고, 그 기능들로 해야할 일을 한번에 처리해주는 클래스를 만들자.”라고 제안하는 것보다 "Facade 패턴을 써보자."라고 제안하는 쪽이 이해하기 쉽다. 일반 프로그래머가 만나는 문제가 지구상에서 유일한 문제일 확률은 거의 없다. 이미 수많은 사람들이 부딪힌 문제다. 따라서 전문가들이 기존에 해결책을 다 마련해 놓았다.

다만 과유불급. 디자인 패턴을 맹신한 나머지 모든 문제를 패턴을 써서 해결하려 드는 패턴병에 걸리지 않도록 조심하자. 디자인 패턴보다 중요한 것은 코드베이스의 간결성이다. 즉 디자인 패턴 적용이 굳이 필요가 없을 것 같은 부분은 적용하지 않는게 상책이다. 디자인 패턴은 알고리즘이 아니라 상황에 따라 자주 쓰이는 설계 방법을 정리한 코딩 방법론일 뿐이며 모든 상황의 해결책이 아니다. 디자인 패턴에 얽매이는 것보단 그 패턴이 왜 효율적인 방식인지를 이해해야 한다. 같은 이름의 패턴이 다른 언어로 구현된 모습을 보면 이에 대해 좀 더 쉽게 이해할 수 있을 것이다.

 

예를 들어, 스테이크 집에서 스테이크를 판매할 때 고객 취향과 굽기에 따라 여러가지 종류의 스테이크를 만들어서 제공을 해야된다고 가정해보자! 그렇다면, 손쉽게 생각해서 함수를 오버로딩을 이용하여 구현할 수 있다.

 

위와 같은 형태로 클래스들을 만들게 된다면, 새로운 종류의 스테이크가 생길때 마다 Chef Class는 매번 수정되어야 한다.

하지만, 스테이크에 대한 요리 지침(Instruction)을 최상위 클래스로 생성하고 그것들을 상속받는 형태로 만든다면, Chef Class는 매번 수정되는 일은 없어질 것이다.

 

디자인패턴의 종류

Creation Patterns(생성패턴)

- 객체가 실제로 생성되는 방식에 더 많은 유연성 제공

- 객체가 생성되는 과정을 캡슐화하여, 추후에 변경 및 수정되어도 다른 구조에 영향을 주지 않도록 한다.

 

Factory Method

Abstract Factory

Builder

Prototype

SingleTon

 

Structual Patterns(구조패턴)

- 추가 기능을 제공하기 위해 inheritance and composition을 사용하는 방법을 다룹니다.

 

Adapter

Bridge

Composite

Decorator

Facade

Flyweight

Proxy

 

Behavioral Patterns(구조패턴)

-  객체 간의 의사소통과 책임 할당에 관한 것

 

Interpreter

Template Method

Chain of Responsibility

Commend

Iterator

Mediator

Memento

Observer

State

Strategy

Visitor