본문 바로가기
프로그래밍/Java

디자인패턴

by freeelifee 2025. 4. 9.
728x90

디자인 패턴은 소프트웨어 개발에서 자주 나타나는 문제를 해결하기 위한 재사용 가능한 설계 방법입니다.
이는 객체지향 프로그래밍에서 코드의 구조를 효율적으로 만들고, 유지보수성과 확장성을 높이는 데 도움을 주는 표준화된 접근 방식입니다.


### 디자인 패턴의 분류
디자인 패턴은 일반적으로 3가지 유형으로 나눠집니다:

#### 1. 생성 패턴 (Creational Patterns)  
객체 생성과 초기화를 다루며, 코드에서 객체 생성 방식을 효율적으로 관리하도록 합니다.  
- 예:  
  - Singleton: 한 클래스에 대해 객체가 하나만 생성되도록 보장합니다.  
  - Factory Method: 객체 생성 과정을 캡슐화하여 유연성을 제공합니다.  
  - Builder: 복잡한 객체 생성 과정을 단계별로 나눕니다.  

#### 2. 구조 패턴 (Structural Patterns)  
클래스와 객체 간의 관계를 정의하며, 다양한 객체를 결합하여 더 큰 구조를 형성합니다.  
- 예:  
  - Adapter: 다른 인터페이스를 가진 클래스를 호환 가능하게 만듭니다.  
  - Decorator: 객체에 새로운 기능을 동적으로 추가합니다.  
  - Composite: 객체를 트리 구조로 구성하여 부분-전체 관계를 표현합니다.  

#### 3. 행위 패턴 (Behavioral Patterns)  
객체 간의 상호작용과 책임 분담을 다루며, 프로세스 흐름을 개선합니다.  
- 예:  
  - Observer: 객체의 상태 변화가 다른 객체에 자동으로 전달되도록 합니다.  
  - Strategy: 알고리즘을 유연하게 선택할 수 있게 합니다.  
  - Command: 명령을 객체로 캡슐화하여 실행/취소 기능을 구현합니다.  


### 왜 디자인 패턴이 중요한가?
1. 코드 재사용성 증가: 문제가 반복적으로 발생할 때, 이를 효과적으로 해결할 수 있습니다.
2. 가독성 향상: 패턴을 사용하면 코드의 설계 의도를 명확히 전달할 수 있습니다.
3. 유지보수 용이: 코드 변경이 필요할 때, 기존 구조를 깨지 않고 추가 구현을 쉽게 할 수 있습니다.
4. 효율적인 개발: 이미 검증된 솔루션을 사용하여 시간과 비용을 절약합니다.


### 예제
#### Singleton 패턴

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

- 용도: 데이터베이스 연결, 설정 파일 관리 등 객체를 하나로 제한해야 할 때 사용.

---

#### Observer 패턴

import java.util.ArrayList;
import java.util.List;

class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

interface Observer {
    void update(String message);
}

class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}

public class ObserverExample {
    public static void main(String[] args) {
        Subject subject = new Subject();
        Observer observer1 = new ConcreteObserver("Observer 1");
        Observer observer2 = new ConcreteObserver("Observer 2");

        subject.addObserver(observer1);
        subject.addObserver(observer2);

        subject.notifyObservers("Hello, Observers!");
    }
}

- 용도: UI 변경, 이벤트 핸들링 등 상태 변화가 필요한 경우.

728x90

'프로그래밍 > Java' 카테고리의 다른 글

람다 표준 함수적 인터페이스  (0) 2025.04.10
디자인패턴 - Strategy 패턴  (0) 2025.04.10
Optional  (0) 2025.04.08
Enum  (0) 2025.04.08
이클립스 SVN LOCK 해제하기  (0) 2023.01.18