Java Study

TIL - 싱글톤 패턴 ->플라이웨이트 패턴 -> 프로토 타입 패턴

초코너무조코 2025. 1. 2. 11:02
728x90

1. 싱글톤 패턴 (Singleton Pattern)

정의

싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하도록 보장하며, 어디서든 이 인스턴스에 접근할 수 있도록 전역 접근점을 제공하는 디자인 패턴입니다.


특징

  • 인스턴스 고유성: 하나의 클래스에 하나의 인스턴스만 존재.
  • 전역 접근: 애플리케이션 어디에서든 동일한 객체에 접근 가능.

장점

  1. 메모리 절약: 하나의 인스턴스만 사용하므로 불필요한 메모리 낭비를 줄임.
  2. 글로벌 상태 관리: 애플리케이션 전체에서 동일한 상태를 유지.

단점

  1. 테스트 어려움: 전역 상태를 가지므로 단위 테스트가 어렵고, 의존성을 분리하기 힘듦.
  2. 멀티스레드 문제: 동시성 제어를 신경 쓰지 않으면 여러 개의 인스턴스가 생성될 수 있음.

자바 코드 예제

public class Singleton {
    // 유일한 인스턴스 저장
    private static Singleton instance;

    // 생성자 private 선언
    private Singleton() {}

    // 인스턴스 반환 메소드
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public void showMessage() {
        System.out.println("Hello, Singleton!");
    }
}

// 사용 예제
public class SingletonExample {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.showMessage(); // "Hello, Singleton!"
    }
}


2. 플라이웨이트 패턴 (Flyweight Pattern)

정의

플라이웨이트 패턴은 공유를 통해 메모리 사용량을 최소화하는 구조적 디자인 패턴입니다. 주로 동일하거나 유사한 객체를 다량으로 생성해야 할 때 사용됩니다.


특징

  • 공유 객체: 동일한 데이터를 공유하여 객체 수를 줄임.
  • 불변성: 공유 객체는 변경되지 않는 불변 상태(공통 데이터)를 가져야 함.

적용 사례

  • 게임의 캐릭터, 총알 등 반복되는 객체 관리.
  • GUI에서 반복적으로 그려지는 컴포넌트.

장점

  1. 메모리 절약: 공유 객체를 사용해 메모리 사용량 감소.
  2. 성능 향상: 객체 생성 비용 절감.

단점

  1. 복잡성이 증가: 상태를 분리하고 공유 객체와 비공유 객체를 구분해야 함.
  2. 코드 가독성 저하.

자바 코드 예제

import java.util.HashMap;
import java.util.Map;

// 플라이웨이트 객체
class Flyweight {
    private final String intrinsicState;

    public Flyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    public void operation(String extrinsicState) {
        System.out.println("Intrinsic: " + intrinsicState + ", Extrinsic: " + extrinsicState);
    }
}

// 플라이웨이트 팩토리
class FlyweightFactory {
    private static final Map<String, Flyweight> flyweights = new HashMap<>();

    public static Flyweight getFlyweight(String key) {
        if (!flyweights.containsKey(key)) {
            flyweights.put(key, new Flyweight(key));
        }
        return flyweights.get(key);
    }
}

// 사용 예제
public class FlyweightExample {
    public static void main(String[] args) {
        Flyweight fw1 = FlyweightFactory.getFlyweight("A");
        Flyweight fw2 = FlyweightFactory.getFlyweight("A");
        Flyweight fw3 = FlyweightFactory.getFlyweight("B");

        fw1.operation("State 1");
        fw2.operation("State 2");
        fw3.operation("State 3");
    }
}


3. 프로토타입 패턴 (Prototype Pattern)

정의

프로토타입 패턴은 객체 생성 비용이 높은 경우, 기존 객체를 복사하여 새로운 객체를 생성하는 패턴입니다. 이 패턴은 클론 메소드를 활용하여 객체를 복제합니다.


특징

  • 깊은 복사와 얕은 복사: 객체 복사 시 포함된 필드의 복사 여부를 결정.
  • 성능 최적화: 복제가 초기화 비용보다 더 빠를 경우 유용.

장점

  1. 객체 생성 비용 절감: 복사를 통해 객체를 생성하므로 효율적.
  2. 유연성: 객체 복제를 통해 런타임에 객체를 동적으로 생성 가능.

단점

  1. 복잡성 증가: 객체의 깊은 복사를 처리하려면 세부 사항 관리가 필요.
  2. 클론 지원 필요: 모든 객체가 복제를 지원해야 하므로 추가 구현이 필요.

자바 코드 예제

// 프로토타입 인터페이스
interface Prototype extends Cloneable {
    Prototype clone();
}

// 구체적인 프로토타입 클래스
class ConcretePrototype implements Prototype {
    private String field;

    public ConcretePrototype(String field) {
        this.field = field;
    }

    @Override
    public Prototype clone() {
        try {
            return (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException("Clone not supported");
        }
    }

    public void setField(String field) {
        this.field = field;
    }

    public String getField() {
        return field;
    }
}

// 사용 예제
public class PrototypeExample {
    public static void main(String[] args) {
        ConcretePrototype prototype1 = new ConcretePrototype("Original");
        ConcretePrototype prototype2 = (ConcretePrototype) prototype1.clone();

        prototype2.setField("Clone");

        System.out.println(prototype1.getField()); // "Original"
        System.out.println(prototype2.getField()); // "Clone"
    }
}

비교

패턴 주요 목적 주요 특징

싱글톤 단일 인스턴스 보장 글로벌 상태 관리
플라이웨이트 메모리 사용 최소화 공유 객체 사용
프로토타입 객체 생성 비용 절감 클론 메소드 활용

 

728x90

'Java Study' 카테고리의 다른 글

TIL- Java Generics  (0) 2025.01.15
TIL - 깊은 복사 vs 얕은 복사  (0) 2025.01.07
TIL - 객체 지향 프로그래밍 (2)  (3) 2024.12.30
TIL - 객체 지향 프로그래밍  (2) 2024.12.30
TIL - super() 에 대하여  (1) 2024.12.23