싱글톤 패턴

YoungMinKim·2020년 12월 4일
0
post-thumbnail

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에 넘긴다.
  • LazyHolderinstancestatic이기 때문에 한번만 호출될 것이며 final을 통해 재 할당 불가능.

정리

  1. 싱글톤 패턴은 JVM에 의해 Class가 로드되는 순간 최초로 딱 한번 메모리에 할당이 된다.
  2. 생성자여러번 호출하게 된다 해도, 실제로 반환되는 인스턴스(객체)는 최초에 생성된 인스턴스이다.
  3. 모든 클래스 내에서 공통적으로 사용이 되는 객체를 싱글톤 객체로 만들어 사용을 한다.
  4. 프로그램 특성에 맞춰, 불필요한 사용 및 공유는 지양해야 한다.

Referance

싱글톤 패턴(Singleton pattern)을 쓰는 이유와 문제점

profile
https://ym1085.github.io

0개의 댓글