Contents
1. 싱글톤 패턴이란?싱글톤 패턴(Singleton Pattern)은 하나의 클래스가 오직 하나의 인스턴스만 가지며, 그 인스턴스를 어디서든지 접근할 수 있도록 하기 위한 디자인 패턴이다. 주로 애플리케이션의 설정을 관리하거나, 로그 관리, 스레드 풀 관리 등에 사용된다.
1. 싱글톤 패턴이란?
싱글톤 패턴은 클래스의 인스턴스가 단 하나만 생성되도록 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접근점을 제공한다. 즉, 애플리케이션 전체에서 하나의 인스턴스를 공유할 수 있도록 하는 패턴.
1.1 예제 1 : 기본적인 싱글톤 패턴 구현
Doorman
클래스가 싱글톤 패턴으로 구현되었습니다. 클래스 내부에 private static
으로 선언된 doorman
인스턴스가 클래스 로드 시점에 생성된다.
public class Doorman {
private static Doorman doorman = new Doorman();
private Doorman() {} // 생성자를 private으로 선언하여 외부에서 인스턴스를 생성하지 못하게 함
public static Doorman getInstance() {
return doorman; // 유일한 인스턴스를 반환
}
// 동물 출입 금지
public void getOut(Animal a) {
System.out.println(a.getName() + " get out!");
}
}
- private 생성자: 외부에서 인스턴스를 생성할 수 없도록
private
으로 선언한다.
- static getInstance 메서드: 유일한 인스턴스를 반환하는
static
메서드로, 이를 통해 애플리케이션 어디서든지 이 인스턴스에 접근할 수 있다.
public class App {
public static void main(String[] args) {
Doorman d1 = Doorman.getInstance();
Doorman d2 = Doorman.getInstance();
System.out.println(d1.hashCode()); // 793589513
System.out.println(d2.hashCode()); // 793589513
}
}
실행결과 주소가 같다. 동일한 인스턴스를 참조하고 있음을 의미한다.
1.2 예제 2 : 간단한 싱글톤 패턴 구현
좀 더 간단하게 싱글톤 패턴을 구현합니다.
instance
필드를 public으로 선언하여 직접 접근할 수 있도록 한다.public class Doorman {
public static Doorman instance = new Doorman();
private Doorman(){}
// 동물 출입 금지
public void getOut(Animal a){
System.out.println(a.getName()+"getOut!");
}
}
public class App {
public static void main(String[] args) {
Doorman d1 = Doorman.instance;
Doorman d2 = Doorman.instance;
System.out.println(d1.hashCode()); // 793589513
System.out.println(d2.hashCode()); // 793589513
}
}
1.3 싱글톤 패턴의 장점
- 전역적인 접근성: 싱글톤 인스턴스는 어디서든 접근할 수 있다.
- 메모리 절약: 인스턴스가 하나만 생성되므로 메모리 낭비를 줄일 수 있다.
- 데이터 일관성: 애플리케이션 전체에서 동일한 인스턴스를 사용하므로, 데이터의 일관성을 유지할 수 있다.
1.4 싱글톤 패턴의 단점
- 멀티스레드 환경에서의 문제: 기본적인 싱글톤 패턴은 멀티스레드 환경에서 안전하지 않을 수 있다. 동시에 인스턴스를 생성하려고 할 때, 두 개 이상의 인스턴스가 생성될 가능성이 있다. 이를 해결하려면
synchronized
키워드 등을 사용하여 스레드 안전성을 확보해야 한다.
- 테스트의 어려움: 싱글톤 패턴은 전역 상태를 가지기 때문에, 단위 테스트에서 모킹(mocking)이 어려울 수 있다.
결론
싱글톤 패턴은 유용하지만, 멀티스레드 환경에서의 사용이나 테스트 가능성에 대한 고려가 필요하다. 필요한 상황에서 신중하게 적용해야 하며, 특히 멀티스레드 환경에서는 추가적인 안전 장치를 마련하는 것이 중요함!
Share article