본문 바로가기
아키텍처+디자인패턴

단일스레드 환경에서 싱글톤 패턴: Eager Initialization / Lazy Initialization

by 나리._. 2021. 10. 20.

단일스레드 환경 - 공통  로그  파일에  모든  사용자  계좌의  입금/출금의  발생  내역을  기록하는 프로젝트

 

설계

실행결과

2020-07-21 at 10:50:33 KST : owner : insang2 withdraw 5000

-> 문제: Insang1의  입금  내역이  누락

 

why?

위의 코드는 Account 인스턴스가  생성될  때  마다  새로운  Logger 인스턴스  생성

해결 방법 : 모든  Account 인스턴스가  하나의  Logger 인스턴스를  공유하도록  설계

Account 클래스와 Main 클래스 변경

위와 같이 변경 후 실행은 제대로 되지만 이 방법은 여러 Logger 인스턴스를 생성하지 못하게 하는 수단을 제공하지 못한다는 문제가 존재한다.

따라서 클래스가 아래 사진과 같이 하나의 인스턴스만을 가지도록 설계해야한다.

 

Eager Initialization

1. instance 선언시 static 변수 이용
2. 생성자를  private으로
3. Logger의 유일한 인스턴스를 생성 및 반환하는 getInstance() 메소드 정의

 

Account 클래스의 Logger를 Logger.getInstance()로 생성

 

위와 같이 설정한 후 실행을 해보면 제대로 출력이 되는 것을 확인할 수 있다.

실행은 제대로 되지만 이 방법은 클래스 로딩 시점에 초기화되어 인스턴스가 필요하지 않는 경우에도 생성된다는 문제점이 있다.

Lazy Initialization을 통해 인스턴스가 필요할 때 생성하는 법을 알아보자.

 

Lazy Initialization

아래와 같이 getinstance()를 변경해준다.