본문 바로가기

프로그래밍 강의 메모/코딩으로 학습하는 GoF의 디자인 패턴_백기선

객체 생성과 관련 디자인 패턴 > 싱글톤 패턴(Singleton Pattern)

https://inf.run/6Shr

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

 

싱글톤 패턴

  • 객체 생성 관련 디자인 패턴.
  • 인스턴스를 오직 한 개만 제공하는 클래스.
  • 시스템 런타임, 환경 세팅에 대한 정보 등, 인스턴스가 여러 개일 때 문제가 생기는 경우 싱글톤 패턴을 사용한다.
  • 인스턴스를 오직 한 개만 만들어 글로벌하게 접근할 수 있는 클래스가 필요한 경우 싱글톤 패턴을 적용한다.



가장 간단하게 구현한다면 private 생성자와 public static 메서드를 사용하여 구현할 수 있다.

 

생성자를 private으로 구현하여 생성자로 인스턴스를 반환할 수 없게 만들어,

 

오직 getInstance() 메서드로 인스턴스를 반환하도록 강제한다.

 

getInstance()는 public static 메서드로 만들어서 글로벌하게 인스턴스를 받게 만든다.

 

하지만 이렇게 구현하였을 경우 멀티쓰레드 환경에서 안전하지 않다.

 

 

 

 

멀티쓰레드 환경에서 안전한 방법

1. synchronized 키워드를 사용한 퍼블릭 스태틱 메서드를 통해 인스턴스를 반환한다.

 

2. 이른 초기화를 사용하여 인스턴스를 미리 만들어 놓고 리턴하기만 한다.

이렇게 하면 synchronized 키워드를 사용할 필요가 없어진다.

 

하지만 미리 만든다는 것 자체가 단점이 될 수 있다.

 

시간이 걸리고 메모리를 많이 잡아먹는 작업인데 만약 만들고 사용하지 않게되면 필요없는 리소스 낭비를 유발할 수 있다.

 

3. double checked locking으로 효율적인 동기화 블럭을 만든다.

인스턴스가 생성되었는지 두 번 확인하는 방법이다.

 

인스턴스가 null일 때만 synchronized를 걸고 안에 들어가서 다시 null인지 확인하고 인스턴스를 생성한다.

 

만약 인스턴스가 null이 아니라면 그대로 반환한다.

 

synchronized 블럭이 실행되는 조건이 이전처럼 getInstance() 할 때마다가 아니라,

인스턴스가 생성 안되었을 때만 실행되어,

더욱 효율적인 코드이다.