정의
디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 효율적이고 검증된 설계 방식입니다.
소프트웨어를 만드는 데 도움을 주는 "문제 해결 팁"이라고 생각하면 됩니다.
유형
디자인 패턴은 크게 생성 패턴, 구조 패턴, 행동 패턴으로 나눌 수 있습니다.
1. 생성 패턴 (Creational Patterns)
생성 패턴은 객체 생성과 관련된 문제를 다룹니다.
객체를 어떻게 생성할지에 대한 접근 방식을 정의하여 객체 생성의 복잡성을 줄이고 유연성을 높일 수 있습니다.
- 추상 팩토리 패턴 (Abstract Factory Pattern)
- 관련된 객체들의 집합을 생성할 수 있는 인터페이스를 제공합니다.
- 예시: 장난감 공장에서 로봇, 자동차, 인형 등 다양한 장난감을 만드는 방법. “장난감을 만들어 주세요!”라고 하면, 공장에서 필요한 종류의 장난감 세트를 만들어 줍니다.
- 빌더 패턴 (Builder Pattern)
- 복잡한 객체를 단계별로 생성할 수 있게 도와주는 패턴입니다.
- 예시: 레고 세트를 조립할 때, 조립 방법을 단계별로 알려주는 매뉴얼. 단계마다 레고 조각을 추가해 가면서 원하는 모양을 만들어 가는 방법입니다.
- 팩토리 메소드 패턴 (Factory Method Pattern)
- 객체를 생성하는 인터페이스를 정의하고, 서브클래스에서 구체적인 객체를 생성하도록 합니다.
- 예시: 빵집에서 여러 종류의 빵을 만들 수 있는 방법. “빵을 만들어 주세요!”라고 하면, 빵집에서 어떤 종류의 빵이 필요할지 알아서 만들어 줍니다.
- 프로토타입 패턴 (Prototype Pattern)
- 객체의 복제(클론)를 통해 새로운 인스턴스를 생성합니다.
- 예시: 친구가 만든 그림을 복사해서 나도 똑같이 그릴 수 있는 방법. 원본 그림을 복사해서 새로운 그림을 만들 수 있습니다.
- 싱글턴 패턴 (Singleton Pattern)
- 클래스의 인스턴스가 오직 하나만 생성되도록 보장하고, 그 인스턴스에 접근할 수 있는 전역적인 접근점을 제공합니다.
- 예시: 학교에는 오직 한 분의 교장 선생님만 계신다. 교장 선생님은 한 명만 있을 수 있고, 모든 학생과 선생님은 그 한 명의 교장 선생님에게만 이야기를 합니다.
2. 구조 패턴 (Structural Patterns)
구조 패턴은 클래스나 객체를 조합하여 더 큰 구조를 형성하는 방법을 정의합니다.
객체 간의 관계를 간단하게 만들고, 재사용성과 유연성을 높입니다.
- 어댑터 패턴 (Adapter Pattern)
- 서로 호환되지 않는 인터페이스를 맞추는 방법이다.
- 기존 코드에 영향을 주지 않고 새로운 인터페이스를 지원할 수 있게 합니다.
- 예시: 오래된 충전기를 최신 스마트폰에 맞게 변환해 주는 어댑터. 충전기를 새로운 포트에 맞게 조정해 줍니다.
- 브리지 패턴 (Bridge Pattern)
- 브리지 패턴은 추상화와 구현을 분리하여 두 가지를 독립적으로 변화시킬 수 있게 해주는 패턴입니다.
- 이 패턴은 상속보다 위임을 사용하여 구현의 세부 사항을 추상화와 분리합니다.
- 예시: 다양한 형태의 컴퓨터와 그에 맞는 운영체제를 생각해보세요. 브리지 패턴을 사용하면 각 컴퓨터와 운영체제 조합을 유연하게 처리할 수 있습니다.
- 컴포지트 패턴 (Composite Pattern)
- 개별 객체와 객체의 집합을 동일한 방식으로 다룰 수 있게 하여 트리 구조를 형성합니다.
- 복합 객체와 단일 객체를 일관되게 다룹니다.
- 예시: 큰 장난감 집을 만들 때 작은 장난감들(인형, 가구 등)을 조합하여 하나의 큰 집을 만드는 방법. 작은 장난감들을 하나의 큰 집으로 만듭니다.
- 데코레이터 패턴 (Decorator Pattern)
- 객체에 동적으로 책임을 추가하는 방법을 제공합니다.
- 기존 객체의 기능을 확장하거나 변경할 때 유용합니다.
- 예시: 기본 티셔츠에 스티커, 자수, 패턴 등을 추가해 멋지게 만드는 방법. 원래의 티셔츠는 그대로 두고, 원하는 장식만 추가하는 겁니다.
- 퍼사드 패턴 (Facade Pattern)
- 퍼사드 패턴은 복잡한 서브시스템의 인터페이스를 단순화하여, 클라이언트가 서브시스템을 쉽게 사용할 수 있도록 돕는 패턴입니다. 즉, 복잡한 내부 구조를 감추고 간단한 인터페이스를 제공합니다.
- 예시: 복잡한 홈 시어터 시스템을 사용할 때, 단순한 리모컨으로 모든 기능을 조작할 수 있게 하는 것과 비슷합니다.
- 플라이웨이트 패턴 (Flyweight Pattern)
- 많은 객체가 동일한 데이터를 공유하도록 하여 메모리 사용을 줄이고 성능을 개선합니다.
- 예시: 공원에 있는 여러 개의 벤치가 모두 같은 디자인을 공유하는 것. 벤치 디자인을 하나로 정하고, 여러 개를 만듭니다.
- 프록시 패턴 (Proxy Pattern)
- 다른 객체에 대한 접근을 제어하기 위해 대리 객체를 제공하는 패턴입니다.
- 객체에 대한 접근을 감싸거나 제어할 수 있습니다.
- 예시: 친구에게 선물을 직접 주기 전에 부모님에게 확인을 받는 것. 부모님이 선물을 확인하고 친구에게 전달해 주는 역할을 합니다.
3. 행동 패턴 (Behavioral Patterns)
행동 패턴은 객체 간의 상호작용과 책임을 정의하며, 효율적인 협력 방식을 제시합니다.
객체 간의 복잡한 행동 패턴을 간단하게 처리할 수 있게 돕습니다.
- 책임 연쇄 패턴 (Chain of Responsibility Pattern)
- 요청을 처리할 수 있는 여러 객체가 있으며, 요청이 처리될 때까지 체인처럼 객체를 순차적으로 전달하는 패턴입니다.
- 예시: 기술 지원 팀에서 문제가 해결될 때까지 문제를 적절한 기술 지원 담당자에게 전달하는 방식입니다.
- 커맨드 패턴 (Command Pattern)
- 요청을 객체로 캡슐화하여 요청의 매개변수화, 요청의 큐잉, 로그 기록 등을 할 수 있습니다.
- 요청을 객체로 다루어 더 유연하게 관리할 수 있습니다.
- 예시: TV 리모컨의 버튼. 각각의 버튼이 다른 명령(전원 켜기, 채널 변경 등)을 실행합니다. 리모컨의 버튼을 누르면 그에 맞는 명령이 실행됩니다.
- 인터프리터 패턴 (Interpreter Pattern)
- 언어의 문법을 표현하고, 문장을 해석하는 방법을 정의하는 패턴입니다. 주로 언어 또는 표현식의 문법을 처리할 때 사용됩니다.
- 예시: 간단한 수식 계산기에서 수식을 해석하고 계산하는 방식입니다.
- 반복자 패턴 (Iterator Pattern)
- 집합체의 요소에 순차적으로 접근할 수 있는 방법을 제공하는 패턴입니다. 내부 구조를 노출하지 않고 요소를 접근할 수 있게 합니다.
- 예시: 리스트의 요소를 순서대로 접근할 수 있는 방법입니다.
- 중재자 패턴 (Mediator Pattern)
- 객체들 간의 복잡한 상호작용을 중앙 집중식으로 처리하여 의존성을 줄이는 방법입니다. 객체들이 직접 상호작용하지 않고 중재자를 통해 상호작용합니다.
- 예시: 사무실의 중재자가 직원들 간의 커뮤니케이션을 관리하는 것처럼, 중재자는 여러 객체 간의 상호작용을 중재합니다.
- 메멘토 패턴 (Memento Pattern)
- 객체의 상태를 저장하고 복원할 수 있도록 합니다.
- 객체의 내부 상태를 외부에서 변경하지 않고도 이전 상태로 되돌릴 수 있습니다.
- 예시: 게임을 저장하고 나중에 다시 불러올 수 있는 방법. 게임을 특정 지점에서 저장해 두고, 필요할 때 그 상태로 돌아갈 수 있습니다.
- 옵저버 패턴 (Observer Pattern)
- 객체의 상태가 변경될 때, 그 객체에 의존하는 다른 객체들에게 알림을 자동으로 전달하는 방법을 제공합니다.
- 예시: 선생님이 수업 중에 중요한 내용을 발표할 때, 모든 학생들이 노트에 필기하는 것. 중요한 내용이 있으면 자동으로 모두 알게 됩니다.
- 상태 패턴 (State Pattern)
- 객체의 상태에 따라 행동을 변경하는 방법입니다. 상태 객체를 사용하여 객체의 행동을 상태에 따라 동적으로 변경할 수 있습니다.
- 예시: 로봇 장난감이 전원 버튼을 누를 때 모드가 바뀌는 것처럼, 상태에 따라 행동을 변경할 수 있습니다.
- 전략 패턴 (Strategy Pattern)
- 알고리즘을 캡슐화하여, 클라이언트가 실행 시에 알고리즘을 선택할 수 있도록 합니다.
- 알고리즘을 독립적으로 변경할 수 있습니다.
- 예시: 운동회에서 달리기, 뛰기, 줄넘기 등 다양한 경기를 선택할 수 있는 방법. 그날의 상황에 맞춰 어떤 운동을 할지 선택합니다.
- 템플릿 메소드 패턴 (Template Method Pattern)
- 알고리즘의 구조를 정의하고, 서브클래스에서 알고리즘의 일부 단계를 구현할 수 있게 합니다.
- 예시: 요리 레시피. 레시피에는 요리의 기본 절차가 정해져 있지만, 어떤 재료를 사용할지는 요리사에 따라 달라질 수 있습니다.
- 비지터 패턴 (Visitor Pattern)
- 객체 구조를 변경하지 않고, 구조에 있는 객체들에 대한 연산을 추가할 수 있는 방법을 제공합니다.
- 객체의 클래스를 변경하지 않고 새로운 기능을 추가할 수 있습니다.
- 예시: 동물원에서 동물들에 대한 정보를 추가하는 안내원. 동물들을 개별적으로 다루지 않고, 동물원 전체에 대한 정보를 추가할 수 있습니다.
'Knowledge > Interview' 카테고리의 다른 글
HTTP 응답 코드 (0) | 2024.08.14 |
---|---|
정적 메서드(Static Method) (0) | 2024.08.14 |
Spring Boot 애플리케이션 기본 구조 (0) | 2024.08.14 |