CS

디자인 패턴

이게왜 2024. 10. 28. 00:23

목차

  1. 싱글톤 패턴
  2. 팩토리 패턴
  3. 전략 패턴
  4. 옵저버 패턴
  5. 프록시 패턴
  6. 이터레이터 패턴
  7. 노출 모듈 패턴
  8. MVC 패턴
  9. MVP 패턴
  10. MVVM 패턴

1. 싱글톤 패턴 (Singleton Pattern)

특징

싱글톤 패턴은 하나의 클래스에 하나의 인스턴스만 존재하도록 보장하는 패턴입니다. 주로 전역적으로 접근 가능한 자원이 필요한 경우에 유용합니다.

 

장점과 단점

장점: 메모리 절약과 인스턴스 생성 비용을 줄일 수 있습니다.

단점: 의도치 않게 멀티스레드 환경에서 문제를 일으킬 수 있습니다.

 

사용 사례

로깅, 설정 관리, 데이터베이스 연결 등에서 많이 사용합니다.

 

Java 예제 코드

public class Singleton {

    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {

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

2. 팩토리 패턴 (Factory Pattern)

특징

객체 생성을 캡슐화하여 인터페이스에 따라 객체를 생성해주는 패턴입니다.

 

장점과 단점

장점: 객체 생성 과정을 분리해 코드의 유연성이 높아집니다.

단점: 코드가 복잡해질 수 있고, 클래스가 많아질 수 있습니다.

 

사용 사례

객체 생성 로직이 자주 변경될 때, 특정 인터페이스를 통해 객체를 생성해야 할 때 유용합니다.

 

Java 예제 코드

public interface Shape {
    void draw();
}

public class Circle implements Shape {
    public void draw() {
        System.out.println("Drawing Circle");
    }
}

public class Square implements Shape {
    public void draw() {
        System.out.println("Drawing Square");
    }
}

public class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}

3. 전략 패턴 (Strategy Pattern)

특징

전략 패턴은 알고리즘을 개별 클래스로 캡슐화하고, 런타임에 교체할 수 있도록 합니다.

 

장점과 단점

장점: 코드의 확장성이 높아지고, 런타임에 다른 전략으로 변경할 수 있습니다.

단점: 전략 클래스를 추가해야 해서 코드가 복잡해질 수 있습니다.

 

사용 사례

동일한 작업을 다양한 방식으로 처리할 때, 예를 들어 정렬, 계산 등의 알고리즘을 구현할 때 사용합니다.

 

Java 예제 코드

public interface Strategy {
    int execute(int a, int b);
}

public class AddStrategy implements Strategy {
    public int execute(int a, int b) {
        return a + b;
    }
}

public class SubtractStrategy implements Strategy {
    public int execute(int a, int b) {
        return a - b;
    }
}

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b) {
        return strategy.execute(a, b);
    }
}

4. 옵저버 패턴 (Observer Pattern)

특징

상태 변화에 따라 자동으로 업데이트해야 하는 객체 집합이 있을 때 사용하는 패턴입니다.

 

장점과 단점

장점: 이벤트 기반 시스템에서 유용하며 관계의 유연성을 높일 수 있습니다.

단점: 옵저버가 많아지면 성능에 영향을 미칠 수 있습니다.

 

사용 사례

GUI 이벤트 리스너, 실시간 데이터 업데이트가 필요한 곳에서 많이 쓰입니다.

 

Java 예시 코드

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

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

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

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

public interface Observer {
    void update();
}

public class ConcreteObserver implements Observer {
    public void update() {
        System.out.println("Observer updated");
    }
}

5. 프록시 패턴 (Proxy Pattern)

특징

프록시 패턴은 실제 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴입니다.

 

장점과 단점

장점: 접근 제어나 로깅을 통해 실제 객체를 보호할 수 있습니다.

단점: 복잡성이 증가하고 성능에 영향을 미칠 수 있습니다.

 

사용 사례

보안이 중요한 객체에 대한 접근 제어, 리소스가 많이 드는 객체의 생성 지연 등에서 사용됩니다.

 

Java 예제 코드

public interface Service {
    void request();
}

public class RealService implements Service {
    public void request() {
        System.out.println("Request processed");
    }
}

public class ProxyService implements Service {
    private RealService realService;

    public void request() {
        if (realService == null) {
            realService = new RealService();
        }
        System.out.println("Logging: Request started");
        realService.request();
        System.out.println("Logging: Request ended");
    }
}

6. 이터레이터 패턴 (Iterator Pattern)

특징

이터레이터 패턴은 컬렉션 요소를 순차적으로 접근하는 방법을 제공하는 패턴입니다.

 

장점과 단점

장점: 컬렉션 구조를 숨기면서 반복 작업을 할 수 있습니다.

단점: 모든 컬렉션에 대해 이터레이터를 작성하는 것은 부담이 될 수 있습니다.

 

사용 사례

배열, 리스트 등 순차적으로 접근이 필요한 컬렉션에서 많이 사용됩니다.

 

Java 예시 코드

import java.util.Iterator;
import java.util.List;

public class CustomIterator<T> implements Iterator<T> {
    private List<T> list;
    private int position = 0;

    public CustomIterator(List<T> list) {
        this.list = list;
    }

    public boolean hasNext() {
        return position < list.size();
    }

    public T next() {
        return list.get(position++);
    }
}

7. 노출모듈 패턴 (Revealing Module Pattern)

특징

모듈 내 특정 함수나 변수를 노출하여 외부에서 접근 가능하도록 하는 패턴입니다. Java보다는 주로 JavaScript 같은 언어에서 사용됩니다.

 

장점과 단점

장점: 코드의 캡슐화와 구조화에 도움이 됩니다.

단점: 코드의 의도를 잘못 전달할 수 있습니다.


8. MVC 패턴 (Model-View-Controller Pattern)

특징

애플리케이션을 모델, 뷰, 컨트롤러로 분리하여 구조화하는 패턴입니다.

 

장점과 단점

장점: 애플리케이션 구조를 분리하여 유지보수가 용이합니다.

단점: 구조가 복잡해질 수 있습니다.

 

사용 사례

웹 애플리케이션에서 사용자 인터페이스와 비즈니스 로직을 분리할 때 자주 사용됩니다.


9. MVP 패턴 (Model-View-Presenter Pattern)

특징

MVC 패턴에서 발전된 형태로, 비즈니스 로직을 프레젠터(Presenter)에서 처리하여 모델과 뷰를 완전히 분리하는 패턴입니다.

 

장점과 단점

장점: UI 테스트가 용이하며, 뷰와 모델 간 결합도를 줄일 수 있습니다.

단점: Presenter의 역할이 커지면서 코드가 복잡해질 수 있습니다.

 

사용 사례

모바일 애플리케이션에서 특히 많이 사용되며, Android 개발에서 많이 활용됩니다.


10. MVVM 패턴 (Model-View-ViewModel Pattern)

특징

뷰와 모델 사이에 뷰모델(ViewModel)을 추가하여 데이터 바인딩을 통해 양방향 데이터 흐름을 구현하는 패턴입니다.

 

장점과 단점

장점: 코드의 유지보수가 용이하고, 데이터 바인딩으로 코드가 간결해집니다.

단점: 코드가 많아질 수 있으며, 데이터 바인딩 사용 시 성능 문제가 발생할 수 있습니다.

 

사용 사례

WPF, Xamarin, Android와 같은 플랫폼에서 주로 사용됩니다.

'CS' 카테고리의 다른 글

IP 주소  (0) 2024.10.13
메모리 구조 (Stack, Heap)  (1) 2024.09.29
메모리  (0) 2024.09.29
운영체제 (System Call, Modebit, Trap, Interrupt, DMA Controller)  (2) 2024.09.29