Languages/디자인패턴
[Java] 싱글톤(Singleton) 패턴
yoon_seon
2023. 6. 10. 19:21
싱글톤 패턴이란
싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다
싱글톤 패턴을 적용하지 않으면
public class Main {
public static void main(String[] args) {
String singleton1 = new String("test");
String singleton2 = new String("test");
if (singleton1 == singleton2) {
System.out.println("같음");
} else {
System.out.println("다름");
}
}
// 출력 결과 : 다름
}
- singleton1과 singleton2는 서로 다른 객체이고 다른 메모리 주소에 저장되어 있기 때문에 결과는 '다름'이 출력된다.
싱글톤 패턴을 적용
싱글톤 패턴을 적용할 클래스
public class Singleton {
private static final Singleton sInstance = new Singleton();
public static Singleton getInstance() {
return sInstance;
}
private Singleton() {}
}
- 객체가 생성될 때 static 영역에 객체를 딱 1개만 생성해둔다.
- 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회할 수 있다. 이 메서드를 호출하면 항상 같은 인스턴스를 반환한다.
- 딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막는다.
public class Main {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
if (singleton1 == singleton2) {
System.out.println("같음");
} else {
System.out.println("다름");
}
}
// 출력 결과 : 같음
}
- 싱글톤 패턴을 적용했기 때문에 객체를 생성하더라도 항상 같은 메모리를 참조한다.
어디서 싱글톤패턴을 적용할까?
싱글톤 적용가능 예시
- 데이터베이스 연결이나 로깅 시스템과 같은 리소스를 공유하는 경우
- 애플리케이션의 설정 정보를 처럼 모든 코드에서 일관된 설정 정보에 접근해야하는 경우
하나의 인스턴스를 가져도 되는게 보장되는 상황에 적용할 수 있으며 예를들어 여러 개의 객체가 동일한 리소스를 공유해야하는 경우 싱글톤 패턴을 사용하면 객체 간의 리소스 충돌을 방지하고 일관된 접근을 제공할 수 있다.