[JAVA] 싱글톤 패턴

HEETAE HEO·2022년 5월 26일
0

DesignPattern

목록 보기
1/1

싱글톤(Singleton) 패턴

: 싱글톤이란 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 객체를 만들어 사용하는 디자인 패턴을 의미합니다.

즉 생성자의 호출이 반복적으로 이뤄져도 실제로 생성되는 객체는 최초 생성된 객체를 반환해주는 것입니다.

싱글톤 패턴을 사용하는 이유

싱글톤의 특징인 한번의 객체 생성으로 재 사용이 가능하기 때문에 메모리 낭비를 방지할 수 있다. 또한 싱글톤으로 생성된 객체는 무조건 한번 생성으로 전역성을 띄기에 다른 객체와 공유가 용이하다. (이러한 특징으로 Android에서도 싱글톤을 이용하여 반복적인 호출을 통해 메모리에 쌓이는 것을 막고 전역성으로 사용하기 위해 사용합니다.)

그렇다고 단점이 없는 것은 아닙니다.

싱글톤의 문제점

일단 싱글톤으로 만든 객체의 역할이 간단한 것이 아닌 역할이 복잡한 경우라면 해당 싱글톤 객체를 사용하는 다른 객체간의 결함도가 높아져서 객체 지향 설계 원칙(OCP, Open-Closed Principle) 에 어긋나게 된다. 또한 싱글톤 객체를 수정할 경우 싱글톤 객체를 사용하는 곳에서 사이드 이팩트가 발생할 확률이 생기게 되고 멀티 쓰레드 환경에서 동기화 처리 문제등이 생기게된다. 또한 JVM이 추가적으로 생성되는 경우 Singleton이 각각에 JVM에 생성이 되어 Sigleton에 위배되는 상황이 발생하게 됩니다.

Singleton 문제점 해결 방법

해당 내용의 경우 추가적인 공부를 통해서 작성하게되었습니다. Singleton을 통해 어떠한 전역 변수를 선언했습니다. 하지만 동작하다 jvm이 하나에서 2개로 늘어나는 경우가 발생할 가능성이 있습니다. 이렇게 된다면 Singleton은 2개가 생성되게 됩니다. 이러한 문제를 해결하기 위해 Koin,Dagger2,Hilt와 같은 DI Framwork를 사용하는 것입니다.

Koin으로 예를 들어보겠습니다.

다음과 같이 Module안에서 Singleton으로 Repository를 생성해보겠습니다.

val appModule = module {

	...
  single<SuggestRepository> {DefaultSuggestRepository()}
  	...
  }

다음과 같이 선언하게 된다면 Koin의 모듈안에서 Singleton으로 생성되게 되고 추가적인 생성이 발생하지 않게되는 것입니다.

코드 예시

public class ExamSingleton{

	private static ExamClass instance = new ExamSingleton();
    
    private ExamSingleton() {}
    
    public static ExampleClass getInstance(){
    	return instance;
        }
    }

위 코드에서 instance라는 전역 변수를 선언하고 static을 줌으로써 인스턴스화 하지 않고 사용할 수 있게 하였지만 접근 제한자가 private로 되어 있어 직접적인 접근은 불가능합니다. 그렇기에 getInstance를 통해 해당 인스턴스를 얻을 수 있게 됩니다.

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글