📌디자인 패턴 (Design Patterns) 정리
디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 재사용 가능한 설계 템플릿입니다.
GoF(Gang of Four)가 처음 정의한 패턴으로, 생성(Creational), 구조(Structural), 행위(Behavioral) 패턴으로 나뉩니다.
1️⃣ 디자인 패턴 개요
✅ 디자인 패턴의 개념
- 반복적으로 발생하는 문제를 해결하기 위한 설계 패턴
- 객체 지향 설계 원칙을 기반으로 함
- 유지보수성과 확장성을 높이고, 코드 재사용성을 증가시킴
✅ 디자인 패턴의 3가지 유형
1️⃣ 생성(Creational) 패턴 → 객체 생성과 관련된 패턴 (객체 생성의 유연성과 재사용성 증가)
2️⃣ 구조(Structural) 패턴 → 클래스 및 객체의 구조와 관계를 정의하는 패턴
3️⃣ 행위(Behavioral) 패턴 → 객체 간의 상호작용 및 책임 분리를 위한 패턴
2️⃣ 생성 패턴 (Creational Patterns) 🏗
✔ 객체의 생성 과정을 캡슐화하여 유연성과 재사용성을 높이는 패턴
✔ 객체의 생성과 초기화 과정에서 발생하는 문제를 해결
패턴 설명 사용 예시
Abstract Factory | 여러 개의 객체를 그룹화하여 생성하는 패턴 | 서로 다른 UI 요소를 그룹화하여 생성 (Windows UI vs Mac UI) |
Builder | 객체 생성을 단계별로 분리하여 객체를 구성하는 패턴 | HTML 문서 생성, 컴퓨터 조립 과정 |
Factory Method | 서브클래스에서 객체 생성을 결정하는 패턴 | 데이터베이스 연결 객체 생성 (MySQL vs PostgreSQL) |
Prototype | 기존 객체를 복제(Cloning) 해서 새로운 객체를 생성 | 대량의 데이터 객체를 복사할 때 사용 |
Singleton | 하나의 객체만 존재하도록 보장하는 패턴 | 데이터베이스 연결 객체, 설정 관리 객체 |
✅ 생성 패턴 사용 예제 (Singleton 패턴 - Java)
public class Singleton {
private static Singleton instance;
private Singleton() {} // 생성자 private
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
✔ getInstance() 메서드를 통해 객체가 한 번만 생성됨
3️⃣ 구조 패턴 (Structural Patterns) 🏛
✔ 클래스 및 객체 간의 관계를 정의하고 효율적으로 결합하는 패턴
✔ 확장성을 고려하여 설계하며, 객체 간 결합도를 줄이는 것이 핵심
패턴 설명 사용 예시
Adaptor | 서로 다른 인터페이스를 연결하여 호환성을 제공 | USB → HDMI 변환기, Java의 Adapter 클래스 |
Bridge | 기능과 구현을 분리하여 독립적으로 확장 가능 | 운영체제별 UI 버튼 구현 (Windows, Mac, Linux) |
Composite | 객체를 트리 구조로 구성하여 계층적으로 관리 | UI 컴포넌트 (윈도우 안에 버튼, 텍스트) |
Decorator | 기존 객체에 새로운 기능을 동적으로 추가 | Java I/O Stream (BufferedReader, FileReader) |
Facade | 복잡한 시스템을 단순한 인터페이스로 감싸는 패턴 | JDBC (Database 연결을 쉽게 처리) |
Flyweight | 공유 가능한 객체를 재사용하여 메모리 사용 최소화 | 대량의 텍스트 렌더링 (폰트 객체 공유) |
Proxy | 대리 객체를 사용하여 실제 객체를 제어 | 데이터베이스 연결 캐싱, 가상 프록시 (Lazy Loading) |
✅ 구조 패턴 사용 예제 (Adapter 패턴 - Java)
interface Target {
void request();
}
// 기존 클래스 (호환되지 않는 클래스)
class Adaptee {
void specificRequest() {
System.out.println("Adaptee's specific request.");
}
}
// Adapter 클래스 (Adaptee → Target 인터페이스로 변환)
class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.specificRequest(); // 기존 클래스의 메서드 호출
}
}
public class AdapterPatternExample {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
✔ Adapter 클래스를 통해 기존 클래스를 새로운 인터페이스와 연결
📌 4. 행위 패턴 (Behavioral Patterns) 🔄
✔ 객체 간의 상호작용과 역할 분리를 효율적으로 관리하는 패턴
✔ 객체의 책임을 명확히 하고 결합도를 낮추는 것이 핵심
패턴 설명 사용 예시
Chain of Responsibility | 요청을 여러 객체가 처리할 수 있도록 연결 | 이벤트 핸들러 체인, 예외 처리 체인 |
Command | 명령을 객체로 캡슐화하여 요청과 실행을 분리 | 버튼 클릭 → 실행되는 동작 분리 |
Interpreter | 언어 문법을 분석하고 해석하는 패턴 | SQL 쿼리 해석기, 정규 표현식 |
Iterator | 컬렉션을 순차적으로 접근하는 패턴 | Java의 Iterator 클래스 |
Mediator | 객체 간의 복잡한 상호작용을 중앙에서 조정 | 채팅 시스템의 중앙 서버 |
Memento | 객체의 상태를 저장하고 복원하는 패턴 | 실행 취소(Undo) 기능 |
Observer | 한 객체의 변경을 다른 객체들이 감지하도록 연결 | GUI 이벤트 리스너, 뉴스 구독 시스템 |
State | 객체의 상태에 따라 동작을 변경 | TCP 연결 상태 관리 (Connected, Disconnected) |
Strategy | 알고리즘을 독립적으로 설계하여 동적으로 변경 | 정렬 알고리즘 변경 (버블 정렬 ↔ 퀵 정렬) |
Template Method | 상위 클래스에서 기본 틀을 정의하고, 하위 클래스가 세부 구현 | Java Abstract Class |
Visitor | 객체 구조를 변경하지 않고, 새로운 기능을 추가 | XML 파서, 파일 시스템 탐색 |
✅ 행위 패턴 사용 예제 (Observer 패턴 - Java)
import java.util.ArrayList;
import java.util.List;
// Observer 인터페이스
interface Observer {
void update(String message);
}
// Concrete Observer (구독자)
class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received: " + message);
}
}
// Subject (유튜브 채널)
class Channel {
private List<Observer> subscribers = new ArrayList<>();
public void subscribe(Observer observer) {
subscribers.add(observer);
}
public void notifySubscribers(String message) {
for (Observer observer : subscribers) {
observer.update(message);
}
}
}
public class ObserverPatternExample {
public static void main(String[] args) {
Channel channel = new Channel();
Observer user1 = new User("Alice");
Observer user2 = new User("Bob");
channel.subscribe(user1);
channel.subscribe(user2);
channel.notifySubscribers("New video uploaded!");
}
}
'자격증 > 정보처리기사' 카테고리의 다른 글
[정보처리기사] 화면설계 (0) | 2025.03.07 |
---|---|
[정보처리기사] 소프트웨어 개발 테스트 관련 내용 정리 (0) | 2025.03.01 |
[정보처리기사] 소프트웨어 개발 생명 주기 관련 개념 (SCRUM,XP,CASE) (1) | 2025.02.25 |
[정보처리기사] 럼바우 분석 방법론 정리 (0) | 2025.02.24 |