17.1 디자인 패턴 개요
디자인 패턴(Design Pattern) 은 소프트웨어 개발에서 반복적으로 등장하는 문제들에 대한 검증된 해결책입니다. 마치 건축의 설계 도면처럼, 비슷한 상황에서 재사용 가능한 코드 구조와 설계 아이디어를 제공합니다.
GoF(Gang of Four)가 1994년 저서 "Design Patterns: Elements of Reusable Object-Oriented Software"에서 정리한 23개의 패턴이 표준으로 통용되며, 크게 3가지로 분류됩니다.
1. 왜 디자인 패턴을 배워야 하나?
- 공통 언어: "여기에 싱글톤 패턴 쓰자"처럼 팀원과 설계 의도를 빠르게 소통할 수 있습니다.
- 검증된 해결책: 수많은 개발자들이 이미 겪은 문제를 다시 처음부터 고민하지 않아도 됩니다.
- 유지보수 용이: 패턴을 따른 코드는 변경과 확장에 강합니다.
- 취업 면접: 디자인 패턴은 백엔드 개발자 면접의 단골 주제입니다.
2. 패턴의 3가지 분류
| 분류 | 목적 | 주요 패턴 |
|---|---|---|
| 생성 (Creational) | 객체 생성 방법을 캡슐화 | Singleton, Factory Method, Builder, Prototype, Abstract Factory |
| 구조 (Structural) | 클래스/객체를 더 큰 구조로 조합 | Adapter, Decorator, Proxy, Facade, Composite |
| 행동 (Behavioral) | 객체 간 책임 분배와 협력 | Strategy, Observer, Template Method, Command, Iterator |
3. 자바에서 디자인 패턴
자바 표준 라이브러리에는 이미 수많은 패턴들이 사용되고 있습니다:
| 패턴 | 자바 표준 라이브러리 예시 |
|---|---|
| Singleton | Runtime.getRuntime(), System |
| Factory Method | Calendar.getInstance(), List.of() |
| Builder | StringBuilder, Stream.Builder |
| Iterator | Iterator<E>, for-each 루프 |
| Observer | EventListener, Observer (레거시) |
| Strategy | Comparator<T>, Runnable |
| Decorator | BufferedReader, Collections.unmodifiableList() |
| Proxy | java.lang.reflect.Proxy |
| Adapter | Arrays.asList(), InputStreamReader |
다음 절에서 실무에서 가장 자주 사용하는 핵심 패턴들을 직접 구현하며 배웁니다.