728x90
1. 싱글톤 패턴 (Singleton Pattern)
정의
싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하도록 보장하며, 어디서든 이 인스턴스에 접근할 수 있도록 전역 접근점을 제공하는 디자인 패턴입니다.
특징
- 인스턴스 고유성: 하나의 클래스에 하나의 인스턴스만 존재.
- 전역 접근: 애플리케이션 어디에서든 동일한 객체에 접근 가능.
장점
- 메모리 절약: 하나의 인스턴스만 사용하므로 불필요한 메모리 낭비를 줄임.
- 글로벌 상태 관리: 애플리케이션 전체에서 동일한 상태를 유지.
단점
- 테스트 어려움: 전역 상태를 가지므로 단위 테스트가 어렵고, 의존성을 분리하기 힘듦.
- 멀티스레드 문제: 동시성 제어를 신경 쓰지 않으면 여러 개의 인스턴스가 생성될 수 있음.
자바 코드 예제
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에서 반복적으로 그려지는 컴포넌트.
장점
- 메모리 절약: 공유 객체를 사용해 메모리 사용량 감소.
- 성능 향상: 객체 생성 비용 절감.
단점
- 복잡성이 증가: 상태를 분리하고 공유 객체와 비공유 객체를 구분해야 함.
- 코드 가독성 저하.
자바 코드 예제
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)
정의
프로토타입 패턴은 객체 생성 비용이 높은 경우, 기존 객체를 복사하여 새로운 객체를 생성하는 패턴입니다. 이 패턴은 클론 메소드를 활용하여 객체를 복제합니다.
특징
- 깊은 복사와 얕은 복사: 객체 복사 시 포함된 필드의 복사 여부를 결정.
- 성능 최적화: 복제가 초기화 비용보다 더 빠를 경우 유용.
장점
- 객체 생성 비용 절감: 복사를 통해 객체를 생성하므로 효율적.
- 유연성: 객체 복제를 통해 런타임에 객체를 동적으로 생성 가능.
단점
- 복잡성 증가: 객체의 깊은 복사를 처리하려면 세부 사항 관리가 필요.
- 클론 지원 필요: 모든 객체가 복제를 지원해야 하므로 추가 구현이 필요.
자바 코드 예제
// 프로토타입 인터페이스
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 |