디자인 패턴
🎨 디자인 패턴 (Design Pattern)
디자인 패턴은 소프트웨어 설계 과정에서 자주 발생하는 문제들을 해결하기 위한, 검증된 일반적인 해결책이나 모범 사례를 의미합니다. 특정 문제를 해결하기 위한 구체적인 코드나 알고리즘이 아니라, 여러 상황에 적용할 수 있는 일종의 '설계 템플릿'입니다.
디자인 패턴을 사용하면 코드의 재사용성을 높이고, 유지보수가 용이하며, 다른 개발자들과의 소통을 원활하게 할 수 있습니다.
📚 디자인 패턴의 종류 (GoF)
가장 널리 알려진 것은 GoF(Gang of Four)라고 불리는 4명의 저자가 정리한 23가지 패턴으로, 생성, 구조, 행위의 세 가지 범주로 나뉩니다.
- 생성 패턴 (Creational Patterns) : 객체의 생성 과정을 유연하고 독립적으로 만드는 데 중점을 둡니다.
> * `싱글톤 (Singleton)` : 클래스의 인스턴스가 오직 하나만 생성되도록 보장합니다. > * `팩토리 메서드 (Factory Method)` : 객체를 생성하는 인터페이스를 제공하되, 어떤 클래스의 인스턴스를 만들지는 서브클래스가 결정하도록 합니다. > * `추상 팩토리 (Abstract Factory)` : 관련 있는 객체들의 집합을 생성하는 인터페이스를 제공합니다. > * `빌더 (Builder)` : 복잡한 객체를 생성하는 과정과 표현을 분리합니다. > * `프로토타입 (Prototype)` : 기존 객체를 복제하여 새로운 객체를 생성합니다.
- 구조 패턴 (Structural Patterns) : 클래스와 객체를 조합하여 더 크고 복잡한 구조를 만드는 방법을 다룹니다.
> * `어댑터 (Adapter)` : 호환되지 않는 인터페이스를 가진 클래스들을 함께 동작하도록 변환해줍니다. > * `데코레이터 (Decorator)` : 객체에 동적으로 새로운 책임을 추가합니다. > * `프록시 (Proxy)` : 다른 객체에 대한 접근을 제어하기 위한 대리자를 제공합니다. > * `퍼사드 (Facade)` : 복잡한 서브시스템에 대한 간단한 통합 인터페이스를 제공합니다. > * `브릿지 (Bridge)` : 구현부에서 추상부를 분리하여, 각각 독립적으로 변경할 수 있도록 합니다.
- 행위 패턴 (Behavioral Patterns) : 객체 간의 상호작용과 책임 분배에 대한 패턴을 다룹니다.
> * `전략 (Strategy)` : 다양한 알고리즘을 각각의 클래스로 캡슐화하고, 동적으로 교체할 수 있게 합니다. > * `옵저버 (Observer)` : 한 객체의 상태가 변하면, 그 객체에 의존하는 다른 객체들에게 자동으로 알려주고 업데이트합니다. > * `템플릿 메서드 (Template Method)` : 알고리즘의 골격은 부모 클래스에 정의하고, 일부 단계는 자식 클래스에서 재정의할 수 있게 합니다. > * `상태 (State)` : 객체의 내부 상태에 따라 행위를 변경하도록 합니다. > * `커맨드 (Command)` : 요청 자체를 객체로 캡슐화합니다.
💡 기술사 핵심 Point
- 디자인 패턴은 바퀴를 다시 발명하지 않도록 도와주는 선배 개발자들의 지혜와 같습니다.
- 패턴의 이름은 개발자들 사이의 공통된 의사소통 언어 역할을 합니다. "여기에 옵저버 패턴을 적용했어요"라고 말하면, 코드를 보지 않고도 대략적인 구조를 이해할 수 있습니다.
- 모든 패턴을 암기할 필요는 없습니다. 각 패턴이 어떤 문제를 해결하기 위해 등장했는지 그 의도를 이해하는 것이 더 중요합니다.
- 디자인 패턴을 무분별하게 적용하면 오히려 코드가 더 복잡해질 수 있습니다. 항상 문제 상황에 맞는 적절한 패턴을 선택해야 합니다.