클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴
전역 변수를 사용하지 않고도 객체를 하나만 생성하여 어디서든지 접근할 수 있도록 함
싱글턴 패턴 적용 전 코드
public class Cat {
String name = "고양이";
public String getName(){
return name;
}
}
public class Mouse {
String name = "쥐";
public String getName(){
return name;
}
}
public class Doorman {
public void 쫒아내(Cat cat){
System.out.println(cat.getName()+" 쫓아내");
}
}
public class App {
public static void main(String[] args) {
Doorman doorman = new Doorman();
Cat cat = new Cat();
doorman.쫒아내(cat);
}
}
적용 후 코드
abstract class Animal {
abstract String getName();
}
public class Cat extends Animal {
String name = "고양이";
public String getName(){
return name;
}
}
public class Mouse extends Animal {
String name = "쥐";
public String getName(){
return name;
}
}
public class Doorman {
static Doorman instance = new Doorman();
private Doorman() {}
public void 쫒아내(Animal animal){
System.out.println(animal.getName()+" 쫓아내");
}
}
public class App {
public static void main(String[] args) {
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.쫒아내(mouse);
doorman.쫒아내(cat);
}
}
장점
- 전역 접근 : 애플리케이션 어디에서든 동일한 인스턴스에 접근.이는 데이터 일관성을 유지하고 전역적으로 공유해야 하는 자원에 적합
- 인스턴스 제어 : 클래스의 인스턴스를 하나만 생성하도록 제어할 수 있어, 메모리 사용을 최적화 불필요한 인스턴스 생성을 방지
- 로딩 지연 : 초기화가 필요할 때만 인스턴스를 생성하는 방식을 통해 리소스를 효율적으로 사용
단점
- 테스트 어려움 : 싱글턴 패턴은 전역 상태를 가지므로 단위 테스트 시 서로 간섭을 일으킬 수 있음. 테스트 환경 설정 및 초기화가 복잡해 질 수 있음
- 의존성 문제 : 싱글턴 인스턴스에 의존하는 코드가 많아지면 결합도가 높아져 코드의 유지보수에 어려움이 생길 수 있음. 객체 간의 의존성이 증가
- 멀티스레드 문제 : 멀티스레드 환경에서는 싱글턴 인스턴스가 올바르게 생성되도록 동기화 처리가 필요 그렇지 않으면 여러 인스턴스가 생성될 수 있음.
Share article