DevBoi

[Java] 싱글톤 패턴 본문

Language/[Java]

[Java] 싱글톤 패턴

HiSmith 2022. 3. 15. 16:04
반응형

싱글턴 패턴을 따르는 클래스는 생성자가 여러차례 호출되더라도, 실제로 생성되는 객체는 하나이고

최초 생성 이후에 호출된 생성자는 최초생성자가 생성한 객체를 리턴한다.

장점

-메모리 측면으로 효율적

-생성된 인스턴스를 활용하여 속도 측면에서 좋다

-전역으로 사용되기 때문에 데이터 공유가 쉽다.

 

단점

- 동시성 문제가 발생할 수 있다.

- 테스트가 어렵다, 자원을 공유하고있기 때문에, 격리된 환경에서 수행하면, 매번 인스턴스의 상태를 초기화 시켜주어야 한다.

- 구체 클래스에 의존적이 된다.

- 자식 클래스를 만들수 없다.

- 내부 상태를 변경하기 어렵다

- 유연성이 많이 떨어진다.

 

 

멀티쓰레드에서는 인스턴스가 여러개 생성되거나, 상태유지가 잘안되어 값에 대한 유지를 잘 못할 수도있다.

 

멀티쓰레드 환경에서 싱글톤의 문제를 해결할 수 있는 방법은 두가지가 있다.

- 정적 변수에 인스턴스를 만들어 바로 초기화 하는 방법

- 인스턴스를 만드는 메서드를 동기화 하는 방법

 

정적변수는 객체가 생성되기 전 클래스가 메모리에 로딩할때 만들어져 초기화가 한번만 실행된다.

정적 변수는 프로그램이 시작될 때부터 종료될때까지 없어지지 않고, 메모리에 계속 상주하며 클래스에서 생성된 모든 객체를 참조 할 수 있게 해준다.

상태변경이나, 이외 의 메소드에는 동기화 메소드를 써서, 다른 쓰레드의 진입을 막는 방법 또한 존재한다.(내부 상태값, 상태에따른 노출 값 등등)

 

-> 싱글 톤은 전체에서 하나의 객체만 공통으로 사용하고있기 때문에 객체간의 결합도가 높고, 변경에 유연하게 대처할수 없다. 

-> 프로그램 전반적으로가 아닌, 필요한 부분만 사용하는 것이 좋다 (전체적으로 사용하면 관리가 어렵다)

 

결론 

멀티 쓰레드 환경에서 싱글톤은 Syncronized, 단일 쓰레드 환경에서는 정적 클래스 형태로 사용 

반응형