Design Patterns

Singleton Pattern -1

goodbye 2022. 10. 24. 22:09

1.  싱글톤(singleton) 패턴


  • 싱글톤이란 인스턴스를 오직 한개만 제공하는 패턴
  • 시스템 런타임, 환경세팅에 대한 정보 등
  • 인스턴스가 여러개일때 문제가 생길 수 있는 경우
  • 인스턴스를 오직 한개만 만들어 제공

 

2.  두개의 인스턴스 비교


  •  다음과 같이 public class 클래스를 만들고

 

  • new 예약어를 통해 생성한 인스턴스를 비교해보면

 

  • 두 인스턴스는 같지 않다는 결과를 확인 가능

 

  • 클래스 외부에서 클래스의 인스턴스를 생성 할 수 있기 때문에
  • 외부에서 인스턴스 생성 제한 필요성을 확인 할 수 있다

 

3.  private , static


  • 클래스 외부에서 클래스의 인스턴스를 직접 생성 할 수 있기때문에
  • private 예약어를 통해 외부에서 생성을 제한하고 메서드를 통해 인스턴스를 생성하도록 구현

a. private 예약어로 생성자의 접근을 제한하면

 

b. 외부 클래스에서 해당 생성자에 접근이 불가능하고

 

c. 메서드를 통해 인스턴스를 통해 접근하도록 변경하더라도

 

d. 마찬가지로 두 인스턴스는 다르다는 결과가 출력된다

e. getInstance() 메서드에서 여전히 new 예약어로 인스턴스를 생성하고 있기때문

 

4.  new 예약어로 매번 인스턴스를 생성하지 않기


  • 매번 new 예약어를 사용하지 않고 인스턴스를 생성해야 동일성이 보장 될 수 있다
  1. 생성된 인스턴스가 없는 경우에만 생성하도록 하고,
  1. 인스턴스가 있는 경우에는 이미 생성된 인스턴스를 리턴

 

b. 두 인스턴스가 동일한지 확인해보면

 

c. 동일하다는 결과를 확인 할 수 있다

 

  • 따라서 이미 생성된 인스턴스가 있는지 체크를 해서 없는 경우에만 생성하면
  • 인스턴스의 동일성이 보장된다(싱글톤)
  • 하지만 멀티쓰레드 환경에는 취약하다는 단점이 존재한다

 

5.  sychronized 키워드 사용하기


  1. sychronized 키워드를 사용한 싱글톤 구현 코드
sychronized 키워드를 사용해서 싱글톤 인스턴스 구현
  • sychronized 키워드를 사용해서 동기화 처리를 할 수 있다
  • 장점 : 멀티쓰레드 환경에서도 하나의 인스턴스를 보장 할 수 있다
  • 단점 : 메서드를 호출 할 때마다 동기화를 위한 성능 부하 발생 여지가 있다

 

  • Double checked locking 을 사용한 싱글톤 구현 코드
double checked locking 을 사용한 싱글톤 인스턴스 구현
  • 이미 인스턴스가 있는 경우에는 동기화를 Skip 할수 있으므로 성능에 유리
  • 필요할때만 인스턴스 생성 가능

 

  1. static inner class 사용하기
static inner class 를 사용한 싱글톤 인스턴스 구현
  • 멀티 쓰레드 환경에서 안전
  • getInstance() 호출될때만 인스턴스 생성 가능(즉 lazy 로딩 가능)