Goal
SNS 로그인 연동 중 싱글톤 패턴에 대한 지식 습득의 필요성을 느껴 정리.
01 싱글톤 패턴이란?
- 클래스가 JVM에 의해 로드되는 순간 최초로 한번만 인스턴스(객체)를 생성한다.
- 생성자를 여러번 호출하여도 실제로 반환되는 인스턴스(객체)는 최초에 생성된 인스턴스를 반환한다.
01-1 싱글톤 패턴 생성 과정
- 생성자는 private로 선언하여 접근을 막는다.
- 생성자가 여러번 호출되는것을 막기 위해 위 같은 선언을 한다.
- getInstance()메서드를 통해서만 해당 인스턴스에 접근을 할 수 있어야 한다.
- 생성자가 아닌, 별도의 메소드를 통해 싱글톤 인스턴스(객체)에 접근 해야 함.
01-2 싱글톤 패턴 장/단점
싱글톤 패턴의 장점
- 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음.
- 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스(객체)이기 때문에, 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
싱글톤 패턴의 단점
- 싱글톤으로 생성된 인스턴스가 너무 많은 데이터를 공유할 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 객체지향적 설계에 어긋나게 된다.
결합도가 높은 프로그램은 좋은 프로그램이 아니다.
01-3 싱글톤 패턴 예제
(Thread-safe) 싱글톤 클래스, 인스턴스 만드는 방법
public class ThreadSafeSingleTonPattern() {
private static ThreadSafeSingleTonPattern instance;
ThreadSafeSingleTonPattern() { }
public static synchronized ThreadSafeSingleTonPattern getInstance(){
if(instance == null){
instance = new ThreadSafeLazyInitialization();
}
return instance;
}
}
synchronized
- sysnchronized를 위 메서드에 선언하였지만, 위 선언은 성능 저하의 원인이 되기에 사용을
지양해야 한다.
01-4 싱글톤 패턴 안에 내부 클래스 선언
public class Something {
private Something() { }
private static class LazyHolder {
public static final Something INSTANCE = new Something();
}
public static Something getInstance() {
return LazyHolder.INSTANCE;
}
}
- JVM의 클래스 초기화 과정에서 보장되는 원자적 특성을 통해 싱글턴 초기화 문제의 책임을 JVM에 넘긴다.
- LazyHolder의 instance가 static이기 때문에 한번만 호출될 것이며 final을 통해 재 할당 불가능.
정리
- 싱글톤 패턴은 JVM에 의해 Class가 로드되는 순간 최초로 딱 한번 메모리에 할당이 된다.
- 생성자를 여러번 호출하게 된다 해도, 실제로 반환되는 인스턴스(객체)는 최초에 생성된 인스턴스이다.
- 모든 클래스 내에서 공통적으로 사용이 되는 객체를 싱글톤 객체로 만들어 사용을 한다.
- 프로그램 특성에 맞춰, 불필요한 사용 및 공유는 지양해야 한다.
Referance
싱글톤 패턴(Singleton pattern)을 쓰는 이유와 문제점