컴퓨터공학

[디자인패턴] 싱글톤(Singleton) 패턴에 대한 이해

TaeGyeong Lee 2023. 8. 9. 15:38

 

개요

싱글톤 패턴은 클래스의 인스턴스화를 단일 인스턴스로 제한하는 소프트웨어 디자인 패턴입니다. '인스턴스'는 프로그래밍 언어마다 지칭하는 표현이 약간 다르지만 일반적으로 정의한 클래스를 현실화한(realized) 객체를 의미합니다. '인스턴스화'는 정의한 클래스 현실화를 의미합니다.

인스턴스화한 단일 인스턴스 하나를 계속 재사용하는 방식입니다. 주로 프로그램 전반에 전역으로 사용해야 하는 경우 싱글톤 패턴을 활용할 수 있습니다.

 

구현

코틀린에서는 object 키워드를 사용하여 싱글톤 패턴 클래스를 작성할 수 있습니다.

object DataProviderManager {
    fun registerDataProvider(provider: DataProvider) {
        // ...
    }

    val allDataProviders: Collection<DataProvider>
        get() = // ...
}

 

인스턴스를 사용하고자 할 때 아래와 같이 사용할 수 있습니다.

DataProviderManager.registerDataProvider(...)

 

한계

싱글톤 패턴은 일반적으로 전역적으로 활용해야 하는 경우 적용하여 사용 메모리를 줄일 수 있습니다.(인스턴스를 매번 클론하지 않아 많은 메모리를 잡아먹지 않기 때문에) 그러나 싱글톤 패턴은 항상 모든 상황에 적절한 디자인 패턴은 아닙니다. 싱글톤 패턴은 아래와 같은 문제점들을 가지고 있습니다.

특히 유닛 테스트 시 서로 독립적인 mock 객체를 생성하는 mocking은 테스트를 위한 핵심 과정인데, 단일 인스턴스여야 하는 싱글톤 패턴 인스턴스를 서로 독립적인 mock 객체로 생성하여 mocking한다..? 많이 이상합니다.

유닛 테스트는 TDD에 핵심입니다. 이를 포기하고 싱글톤 패턴을 적용하는 것이 맞는 지는.. 많은 고민이 필요해 보입니다. 

 

출처

 

Singleton pattern - Wikipedia

From Wikipedia, the free encyclopedia Design pattern in object-oriented software development A class diagram exemplifying the singleton pattern. In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of

en.wikipedia.org

 

Object expressions and declarations | Kotlin

 

kotlinlang.org

 

Singleton Pattern의 함정

Runtime에 유일한 상태를 공유하기 위해서 singleton을 많이 사용하는데, 우리가 singleton class를 만들때 기대하는 바는 위 [그림 1]과 같다. Singleton은 다른 object들과의 dependency 관계가 쉽게 맺어지고 사

develogs.tistory.com