[Java] 싱글톤 패턴

JAVA Singleton Pattern

Posted by Wonyong Jang on March 29, 2020 · 3 mins read

자바 싱글톤 패턴

애플리케이션이 시작될 때 어떤 클래스가 한번만 메모리를 할당(Static) 하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴

생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다.(자바에선 생성자를 private로 선언해서 생성불가하게 하고 getInstance()로 받아쓰기도 함)

=> 즉, 인스턴스가 필요 할 때 인스턴스를 또 만드는게 아니라 동일(기존) 인스턴스를 사용하게 한다.

스크린샷 2020-03-29 오후 3 38 46

위의 Main 클래스는 테스트를 하기위해 main메서드를 포함한 클래스이고, Normal 클래스는 생성자만 존재하는 클래스이다. 마지막으로 Singleton 클래스는 생성자와 getInstance() 라는 메서드를 포함한 클래스이다. 여기서 중요한 점은 생성자가 private로 지정되어 있다는 점이다.

스크린샷 2020-03-29 오후 3 47 57

위는 new 연산자로 인스턴스 만드는 것과 싱글톤 패턴을 이용하여 인스턴스를 만드는 것의 차이를 확인하기 위함

스크린샷 2020-03-29 오후 3 48 08

Singleton 클래스를 만들 때 눈여겨봐야 할 부분은 바로 생성자 부분이다. 대부분 생성자를 만들 때 public으로 선언하는데, 지금 싱글톤 패턴에서는 private으로 선언했는데, private 으로 생성자를 만들어놓으면 new 연산자로 생성이 불가능하다!

Singleton이라는 클래스를 new 연산자로 생성하려고 할때 private 생성자가 못하게 강제한다는점이 중요하다!

private static Singleton singleton = new Singleton();

new 연산자로 객체를 생성하지 못하는 클래스가 되어버린 Singleton 클래스는 위 부분에서 정적으로 싱글톤 클래스의 객체를 선언했다. private으로 생성된 생성자는 자기 자신에서는 호출이 가능하기 때문이다.

이렇게 생성해 놓은 시이글톤 클래스의 객체를 getInstance 메서드를 반환하는데 결과적으로 Singleton 객체를 단 한번만 생성해 놓고 다른 클래스에서 반환을 요구할 때 항상 같은 객체를 반환시켜 줄수 있다!!

스크린샷 2020-03-29 오후 3 48 23 스크린샷 2020-03-29 오후 4 03 17 스크린샷 2020-03-29 오후 4 05 31

싱글톤 사용 이유

고정된 메모리 영역을 사용하도록 하여 단 한번 new 연산자로 인스턴스를 얻어오기 때문에 메모리 낭비를 줄인다.

전역변수로 선언되고 전역메서드로 호출하기 때문에 다른 클래스에서 사용하기 쉽다.

공통된 객체를 사용해야하는 코딩에서 매번 객체를 생성하지 않고 같은 객체를 사용하도록하면 성능면에서 뛰어나다!

싱글톤 패턴의 문제점

싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 객체 지향 설계 원칙에 어긋날수 있다.

따라서 수정이 어려워지고 테스트하기 어려워진다.

멀티쓰레드환경에서 동기화처리를 안하면 인스턴스가 두개가 생성된다든지 하는 경우가 발생할 수 있다.

멀티쓰레드에서 안전한(Thread-safe) 싱글톤 클래스, 인스턴스 만드는 방법

포스팅 준비중


Reference

https://commin.tistory.com/121
https://jeong-pro.tistory.com/86
https://javaplant.tistory.com/21