싱글톤(SINGLETON) 패턴이란 무엇인가?


싱글톤 패턴은 하나의 어플리케이션 내에서 하나의 인스턴스(객체)만 사용해야하는 상황에 주로 사용됩니다. 

(어플리케이션 전체 영역에서 하나의 클래스의 단 하나의 인스턴스를 생성하여 사용하는 것을 의미합니다.)

환경설정 관리 클래스나, 커넥션 풀과 같이 Pool 형태로 관리되는 클래스 등의 공통 클래스에 사용되는 것이 일반적입니다.

구현 및 사용이 간단한 만큼 남용하기 쉬운데 한 번 생성된 이후에는 어플리케이션 종료시까지 항상 메모리에 상주하게 되므로 필요한 경우에만 적절히 활용해야 메모리가 낭비되는 것을 막을 수 있습니다.

iOS에서는 대표적으로 UIApplication, AppDelegate 등이 싱글톤 패턴입니다.




싱글톤(SINGLETON) 패턴을 왜 사용하는 것인가?


예를 들어 사용자 정보를 처음에만 로딩해주는 UserManager 클래스가 있다고 하면, 매번 이 인스턴스를 생성하는 것은 자원 낭비 또는 잘못하다간 인스턴스가 꼬이는 일이 발생될 수 도 있습니다.

그러나 UserManager 클래스를 싱글톤 패턴으로 구현한다면 어플리케이션 어느 영역에서든 UserManager클래스를 사용할 수 있습니다. 그래서 싱글톤 패턴으로 구현하는 것이 좋습니다.




싱글톤(SINGLETON) 패턴을 어떻게 사용하는지 (Swift)


class UserManager {
    static let sharedInstance = UserManager()
    var x: Int = 0
    private init() { }
}

외부에서는 클래스에 대한 인스턴스를 직접 생성하지 못하도록 생성자는 private 으로 선언해줍니다.

Swift에서 let으로 선언한 것은 기본적으로 thread-safe 하므로 별도로 dispatch_once_t 같은 처리를 해주지 않아도 되며, static 전역 변수로 선언한 것은 lazy 하게 동작하므로 가장 처음 Singleton을 생성하기 전에는 메모리에 올라가지 않습니다.


class UserManager {
    static let sharedInstance : UserManager = {
        let instance = UserManager()
        ...
        return instance
    } ()

    private init() { }
}

초기 설정에 필요한 내용들이 있다면 이와 같이 구현해 줄수도 있습니다.


let instance: UserManager = UserManager.sharedInstance
print(instance.x)

let instance1 = UserManager()   // 생성자를 private으로 선언했으므로 에러 발생.

싱글톤 클래스에 접근할 때는 다음과 같이 클래스. 싱글톤 변수로써 접근합니다.