
객체지향 디자인 패턴
객체지향 디자인 패턴은 소프트웨어 설계 시 자주 발생하는 문제를 재사용 가능한 방식으로 해결하기 위한 일반적인 설계 템플릿이다.
생성, 행동, 구조라는 3가지 범주로 용도에 따라 나뉜다.

생성(Creational) 패턴 - "어떻게 만들까?"
객체 인스턴스를 생성하는 패턴으로, 클라이언트와 그 클라이언트가 생성해야 할 객체 인스턴스 사이의 연결을 끊어주는 패턴이다.
- 싱글톤(Singleton) : 객체를 하나만 생성해서 어디서든 접근 가능하도록 만든다.
- 팩토리 메서드(Factory Method) : 한 종류의 객체 생성을 서브 클래스/메서드에 위임한다.
- 추상 팩토리(Abstract Factory) : 연관된 객체들의 집합을 생성하는 인터페이스를 제공한다.
- 빌더(Builder) : 복잡한 객체 생성을 단계별로 진행한다.
- 프로토타입(Prototype): 기존 객체를 복제해서 새 객체를 생성한다.

구조(Structural) 패턴 - "어떻게 조합할까?"
클래스와 객체를 조합하여 더 큰 구조를 만드는 패턴이다.
- 어댑터(Adapter): 인터페이스를 변환해 호환성을 제공한다.
- 브리지(Bridge): 구현부와 추상부를 분리해 독립적으로 확장할 수 있다.
- 컴포지트(Composite): 객체들을 트리 구조로 묶어 계층 구조를 표현한다.
- 데코레이터(Decorator): 기존 객체에 기능을 동적으로 추가한다.
- 파사드(Facade): 복잡한 시스템을 단순한 인터페이스로 치환한다.
- 플라이웨이트(Flyweight): 메모리를 절약하기 위해 공유 객체를 사용한다.
- 프록시(Proxy): 접근 제어나 지연 로딩을 위한 대리 객체 방식이다.

행위(Behavioral) 패턴 - "어떻게 소통할까?"
클래스와 객체 간 상호작용 방법 및 역할 분담을 관리하는 패턴이다.
- 옵저버(Observer): 객체 상태가 변화하면 이벤트 리스너 등을 통해 자동으로 알린다.
- 전략(Strategy): 알고리즘을 캡슐화하고, 런타임에 교체가 가능하다.
- 상태(State): 객체 상태에 따라 동작을 바꾼다.
- 템플릿 메서드(Template Method): 알고리즘 구조를 정의하고 세부 구현은 서브클래스가 담당한다.
- 커맨드(Command): 요청을 객체로 캡슐화하며, 실행/취소/저장 모두 가능하다.
- 반복자(Iterator): 컬렉션 요소에 순차적으로 접근한다.
- 중재자(Mediator): 객체 간 복잡한 관계를 중재자 객체가 관리한다.
- 메멘토(Memento): 객체의 상태를 저장하고 복원한다.
- 책임 연쇄(Chain of Responsibility): 요청을 여러 객체가 순차적으로 처리한다.
디자인 패턴 내 객체 구분

디자인 패턴에서 객체 구분
디자인 패턴에서는 역할을 명확히 하기 위해 각 객체를 구분해서 사용한다.
주요 역할들은 아래와 같다.
| 역할 | 설명 | 예시 |
| Client (클라이언트) | 패턴을 사용해서 객체를 사용하는 주체 | main() 함수, 서비스 코드 |
| Product (제품) | 생성되는 객체, 클라이언트가 사용하는 대상 | Button, Shape |
| Creator / Factory | 객체를 생성하는 책임을 가진 객체 | 추상 클래스 |
디자인 패턴에서 '클라이언트'란?
클라이언트(Client)는 디자인 패턴에서 패턴이 적용된 객체를 실제로 사용하는 코드나 객체를 의미한다.
쉽게 말하면 "패턴을 호출해서 결과를 사용하는 주체"로, 개발자가 직접 쓰는 코드라 할 수 있다.
예를 들어 Factory Method 패턴을 보면 'dialog.renderDialog()'를 호출하는 부분이 바로 클라이언트다.
val dialog: Dialog = if ("win" in os) WindowsDialog() else MacDialog()
dialog.renderDialog() // ← 이 부분을 호출하는 코드가 '클라이언트'
클라이언트는 어떤 구체적인 클래스인지 몰라도 인터페이스(Dialog)만 알고 있으면 객체를 사용할 수 있다.
클라이언트와 책임 분리
디자인 패턴의 핵심 목표 중 하나는 책임을 분리하는 것이다.
예를 들어, Factory Method 패턴은 아래와 같이 역할을 구분하여 책임을 분리한다.
- Client : 객체 사용
- Creater / Factory : 객체 생성
- Product : 실제 동작
이렇게 분리함으로써 클라이언트는 객체 생성 방법에 신경 쓸 필요 없이 바로 기능을 사용할 수 있고, 코드 변경 시에는 클라이언트 코드 수정 없이 Factory만 변경해도 된다.
참고 자료
- [Design pattern] 많이 쓰는 14가지 핵심 GoF 디자인 패턴의 종류 - 한빛+
- [OOP] 디자인 패턴(Design Pattern)이란? - 장점 및 종류
- Factory Design Pattern. The factory design pattern is a… | by Pawara Gunawardena | Medium
Powered By. ChatGPT
'Backend' 카테고리의 다른 글
| [Backend] Singleton 패턴 (1) | 2025.09.03 |
|---|---|
| [Backend] Bulider 패턴 (1) | 2025.09.03 |
| [Backend] Factory 패턴 (1) | 2025.09.03 |
| [Backend] Git & GitHub 소개 (0) | 2025.09.02 |
| [Backend] Kotlin 소개 (w. JVM) (1) | 2025.09.02 |