1. 패턴 개요
- 싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하고, 그 인스턴스를 전역적으로 공유하는 디자인 패턴.
- 단일 인스턴스가 애플리케이션 전체에서 사용되도록 보장.
2. 목적
- 하나의 인스턴스만 존재하도록 보장.
- 자원 관리가 필요한 상황에서 효율적.
- 전역 상태 관리와 객체 생성 비용 절감에 유용.
3. 특징
- 인스턴스화: 클래스의 인스턴스는 하나만 존재.
- 전역 접근: 어디서든지 유일한 인스턴스를 공유.
- 지연 초기화: 인스턴스는 필요할 때만 생성.
4. 구현 코드
4.1 Doorman 싱글톤 구현
public class Doorman {
// 인스턴스가 하나만 존재하도록 static 변수로 선언
private static Doorman instance;
// 생성자는 private로 외부에서 직접 호출할 수 없도록 설정
private Doorman() {}
// Animal 객체를 받아서 쫓아내는 메서드
public void 쫓아내(Animal animal) {
System.out.println(animal.getName() + " 쫓아내");
}
}
4.2 Animal 클래스 및 하위 클래스들
public abstract class Animal {
public abstract String getName();
}
public class Cat extends Animal {
private String name = "고양이";
@Override
public String getName() {
return name;
}
}
public class Mouse extends Animal {
private String name = "쥐";
@Override
public String getName() {
return name;
}
}
4.3 App 클래스에서 싱글톤 사용
public class App {
public static void main(String[] args) {
// Doorman 인스턴스를 싱글톤 방식으로 가져옴
Doorman doorman = Doorman.instance;
Doorman doorman2 = Doorman.instance;
System.out.println(doorman.hashCode());
System.out.println(doorman2.hashCode());
// 여러 동물 객체 생성
Mouse mouse = new Mouse();
Cat cat = new Cat();
// Doorman 인스턴스를 통해 동물들을 쫓아냄
doorman.쫓아내(cat); // 고양이 쫓아내
doorman.쫓아내(mouse); // 쥐 쫓아내
}
}
4.4 설명
- Doorman 클래스:
Doorman
은 싱글톤으로 구현되어,getInstance()
메서드를 통해 하나의 인스턴스만 생성되며, 애플리케이션 어디서든 그 인스턴스를 사용할 수 있습니다.
쫓아내(Animal animal)
메서드는 Animal 타입 객체를 받아서 해당 동물의 이름을 출력하고 "쫓아내"라는 메시지를 출력합니다.
- Cat과 Mouse 클래스는
Animal
클래스를 상속받아 각각 고양이와 쥐의 이름을 반환하는getName()
메서드를 구현합니다.
4.5 출력 결과
793589513
793589513
고양이 쫓아내
쥐 쫓아내
hash코드가 같은 모습
5. 장점
- 자원 절약: 불필요한 객체 생성을 방지하고 메모리 낭비를 줄임.
- 상태 관리: 하나의 인스턴스를 통해 전역 상태 관리가 용이.
- 전역 접근: 애플리케이션 어디서나 동일한 인스턴스 사용.
- 성능 최적화: 필요한 시점에만 인스턴스를 지연 초기화하거나 동기화 처리.
6. 단점
- 테스트 어려움: 싱글톤 객체가 전역적으로 공유되어 단위 테스트나 의존성 주입에서 어려움 발생.
- 유연성 부족: 유일한 인스턴스를 강제하므로 확장성이 제한될 수 있음.
- 병렬성 문제: 멀티스레드 환경에서 동기화 문제가 발생할 수 있음.
Share article