개발자의 학습법

OOP 디자인 패턴이란?

J_Log1 2024. 11. 3. 18:33

객체 지향 설계에서 디자인 패턴은 반복적으로 발생하는 문제들에 대한 검증된 해결책을 제공한다. 이는 코드의 품질과 유지보수성을 개선하는 데 기여한다. 디자인 패턴은 크게 세 가지 유형으로 구분된다.

1. 생성 패턴

  • 객체 생성 메커니즘에 초점을 맞춘다. 예: 싱글톤 패턴은 클래스의 인스턴스가 단 하나만 존재하도록 보장한다.

2. 구조 패턴

  • 객체와 클래스를 더 큰 구조로 조직화한다. 예: 어댑터 패턴은 서로 다른 인터페이스를 가진 클래스들이 협력할 수 있게 한다.

3. 행위 패턴

  • 객체 간 상호작용과 책임 분배를 다룬다. 예: 옵저버 패턴은 한 객체의 상태 변화를 다른 객체들에게 자동으로 알린다.

이러한 패턴들은 특정 상황에서 효과적으로 적용될 수 있으며, 적절히 사용될 경우 소프트웨어의 전반적인 설계 품질을 향상시킬 수 있다.


1. 생성 패턴 (Creational Patterns)

생성 패턴은 객체 인스턴스화 과정을 다루며, 유연성과 재사용성을 높이는 데 중점을 둔다.

  • 싱글톤 (Singleton) : 클래스의 인스턴스가 오직 하나만 생성되도록 보장한다. 예: 전역 설정 관리자.
  • 팩토리 메서드 (Factory Method) : 객체 생성 로직을 자식 클래스로 위임한다. 이를 통해 객체 생성의 유연성을 확보한다.
  • 애트리뷰트 팩토리 (Abstract Factory) : 연관된 객체군을 생성하기 위한 인터페이스를 제공한다. 이는 시스템의 독립성과 교체 가능성을 높인다.
  • 빌더 (Builder) : 복잡한 객체의 구축 과정과 표현 방법을 분리한다. 예: 다양한 형식의 문서 생성기.
  • 프로토 타입 (Prototype) : 기존 객체를 복사하여 새 객체를 만든다. 이는 객체 생성 비용을 줄이는 데 효과적이다.

2. 구조 패턴 (Structural Patterns)

구조 패턴은 클래스와 객체를 조직화하여 더 큰 구조를 형성하는 설계 방식을 제공한다. 이 패턴들은 시스템의 유연성과 효율성을 높이는 데 기여한다.

  • 어댑터 (Adapter): 호환되지 않는 인터페이스들을 연결하여 함께 작동할 수 있게 한다. 이는 기존 코드를 수정하지 않고도 새로운 시스템과 통합할 수 있게 해준다.
  • 데코레이터 (Decorator): 객체에 동적으로 새로운 책임을 추가할 수 있게 한다. 예를 들어, 기본 텍스트 편집기에 맞춤법 검사 기능을 추가하는 경우에 사용할 수 있다.
  • 프록시 (Proxy): 다른 객체에 대한 대리자 또는 자리표시자 역할을 한다. 이를 통해 원본 객체에 대한 접근을 제어하거나 추가 기능을 제공할 수 있다.
  • 퍼사드 (Facade): 복잡한 하위 시스템에 대해 단순화된 인터페이스를 제공한다. 이는 클라이언트가 시스템의 복잡성을 이해하지 않고도 쉽게 사용할 수 있게 해준다.
  • 컴포지트 (Composite): 객체들을 트리 구조로 구성하여 부분-전체 계층을 표현한다. 이를 통해 개별 객체와 복합 객체를 동일하게 다룰 수 있다.
  • 브리지 (Bridge): 추상화와 구현을 분리하여 둘을 독립적으로 변형할 수 있게 한다. 이는 시스템의 확장성과 유지보수성을 향상시킨다.

3. 행동 패턴 (Behavioral Patterns)

행동 패턴은 객체들 사이의 상호작용과 책임 분배에 초점을 맞춘다. 이 패턴들은 객체 간 통신을 효율적으로 관리하고, 유연한 시스템 구조를 만드는 데 도움을 준다.

  • 옵저버 (Observer): 한 객체의 상태 변화를 다른 객체들에게 자동으로 알린다. 예: 소셜 미디어 플랫폼에서 새 게시물 알림.
  • 전략 (Strategy): 알고리즘을 별도의 클래스로 캡슐화하여 실행 중에 교체할 수 있게 한다. 예: 다양한 결제 방식을 지원하는 온라인 쇼핑몰.
  • 템플릿 메서드 (Template Method): 알고리즘의 구조를 정의하고 일부 단계를 하위 클래스에서 구현하도록 한다. 예: 다양한 보고서 생성 프로세스.
  • 커맨드 (Command): 요청을 객체로 변환하여 매개변수화하고, 실행 취소 등의 기능을 지원한다. 예: 그래픽 편집기의 작업 히스토리.
  • 상태 (State): 객체의 내부 상태에 따라 행동을 변경할 수 있게 한다. 예: 자판기의 작동 상태 관리.
  • 방문자 (Visitor): 기존 클래스 구조를 변경하지 않고 새로운 동작을 추가할 수 있게 한다. 예: 복잡한 문서 구조에 대한 다양한 처리 방식 구현.
  • 중재자 (Mediator): 객체 간 직접적인 의존성을 줄이고 중앙 집중식 통신을 구현한다. 예: 항공 교통 관제 시스템.
  • 메멘토 (Memento): 객체의 내부 상태를 저장하고 나중에 복원할 수 있게 한다. 예: 텍스트 편집기의 실행 취소 기능.

디자인 패턴은 코드의 품질을 높이고 유지보수를 용이하게 하며, 재사용성과 확장성을 개선하는 데 중요한 역할을 한다. 적절한 상황에서 이러한 패턴을 효과적으로 적용하면, 소프트웨어 설계의 전체적인 품질이 크게 향상될 수 있다.