개발자 항해

싱글톤(singleton) 본문

Programming/Java

싱글톤(singleton)

리치Y 2022. 7. 22. 22:48

 

  • 싱글톤 패턴식

싱글톤 패턴을 하나하나 분석해보자

각각의 의미를 간단히 얘기해보자면 

private로 생성자 접근을 차단하고 static메서드를 통해 유일한 인스턴스를 반환한다는 의미

 

 

아래는 복잡한 설명을 없앤 원래 식이다.

 

유일한 인스턴스반환? 그렇다면 주소값이 같을까?

 

 

 

static이므로 클래스명.메서드명으로 불러 반환되는 인스턴스를 car1 car2에 담고

주소값출력 및 (==) 연산자로 비교해본다.

 

주소값이 같고 결과 값은 true가 반환 되었다.

 

 

 

그렇다면 노멀 클래스를 생성해서 인스턴스를 불러왔을때는 싱글톤과 결과가 다를까?

 

예시를 위해 노멀 클래스 생성.

 

그리고 각각 인스턴스를 생성하여 n1, n2변수를 찍어보면

 

 

노멀클래스는 힙 안에 각각 n1,n2인스턴스가 따로 생성되고

그로인해 n1,n2에는 서로 다른 주소값이 들어가서 

( == ) 연산자로 비교해봤을때   아래와 같이 false가 출력되었다.

 

 

 

  • 싱글톤(singleton)이란?

 애플리케이션이 시작될때 어떤 클래스가 최초 한번만 메모리를 할당하고 (static) 

그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴

 일반적으로 java에서는 생성자를 private로 선언해서 생성 불가능하게 하고

getInstance() 메서드를 작성해서 객체를 받도록 구현한다. 

=> 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인패턴이다. 

 

  • 싱글톤 패턴을 쓰는 이유

1. 고정된 메모리 영역을 얻으면서 한번의  new로 인스턴스를 사용하기 때문에 메모리 낭비를 

    방지할수 있음

2. 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기때문에 다른 클래스의 인스턴스들이

    데이터 공유하기 쉽다. 

    DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러 인스턴스 변수로

    사용해야하는 상황에서 많이 사용한다. ( 쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 로그기록 객체등)

3. 안드로이드 앱 같은 경우 각 액티비티나 클래스별로 주요 클래스들을 일일이 전달하기가 번거롭기 때문에

    싱글톤 클래스를 만들어서 어디서나 접근하도록 설계

=> 결론. 인스턴스(객체)가 절대적으로 한개만 존재하는것을 "보장하고 싶을때"

 

  • 문제점

1. 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우

    다른 클래스의 인스턴스들 간에 결합도가 높아져 수정(유지보수)이 어려워지고 테스트 하기 어려워진다.

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