디자인 패턴(Design Pattern)이란?
소프트웨어 디자인 패턴(software design pattern)은 소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다. 소스나 기계 코드로 바로 전환될수 있는 완성된 디자인은 아니며, 다른 상황에 맞게 사용될 수 있는 문제들을 해결하는데에 쓰이는 서술이나 템플릿이다. 디자인 패턴은 프로그래머가 어플리케이션이나 시스템을 디자인할 때 공통된 문제들을 해결하는데에 쓰이는 형식화 된 가장 좋은 관행이다.
- 위키백과 -
디자인 패턴이란 개발하면서 생기는 문제들을 먼저 경험한 선배 개발자들이 만들어 놓은 해결책이다. 그래서 우리는 디자인 패턴을 잘 익혀두었다가 비슷한 문제가 발생할 여지가 있을 때 디자인 패턴을 잘 사용해서 해결하면 되는 것이다.
즉, 디자인 패턴은 개발자들이 올바른 설계를 빨리 만들 수 있도록 도와주는 가이드 라인이다.
디자인 패턴의 장점
- 개발자 간의 원활한 의사소통
다른 개발자와 패턴으로 의사소통을 하면 패턴 이름과 그 패턴에 담겨있는 의미를 빠르게 전달할 수 있다.
예를 들면 "교통편의 다양한 특징을 전략 패턴으로 구현하고 있습니다."라고 하면 이는 교통편의 특징들을 쉽게 변경하거나 확장할 수 있는 클래스들의 집합으로 캡슐화 되어있다라는 사실을 간단하게 표현할 수 있다.
- 소프트웨어 구조 파악 용이
디자인 패턴을 이용하여 유지보수나 문서화를 하면 다른 개발자들도 금방 구조를 파악할 수 있다.
- 재사용을 통한 개발 시간 단축
이미 발명한 바퀴를 다시 만들지 말라는 말이 있다. 디자인 패턴으로 잘 만들어진 구조를 재사용하여 불필요한 리소스 낭비를 줄일 수 있다.
디자인 패턴 유형
디자인 패턴의 사실상 교과서라고 불리는 [GOF의 디자인패턴]에서는 객체지향적 디자인 패턴의 카테고리를 다음과 같은 3가지로 구분한다.
- 생성(Creational) 패턴
- 객체 생성에 관련된 패턴
- 객체의 성성과 조합을 캡슐화하여 특정 객체가 생성, 변경 되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공
- 구조(Structural) 패턴
- 클래스와 객체의 구성에 관련된 패턴
- 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
- 예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴
- 행동(Behavioral) 패턴
- 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
- 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도 최소화하는 것에 중점을 둠.
다음은 디자인 패턴을 위의 세가지 유형으로 분류한 표이다.
참고: https://readystory.tistory.com/114
디자인 패턴 설명
각각의 디자인 패턴을 JAVA로 설명 및 구현을 해보려고 한다.
각 디자인 패턴의 포스팅마다 다음을 중심으로 설명하려고 한다.
- 문제 상황
- 어떤 문제 상황에서 이 패턴이 의미가 있는지 예시를 통해 설명함.
- 구현
- 결과
- 해당 디자인 패턴을 적용해서 얻는 결과와 장단점을 설명