티스토리 뷰

Swift/Clean Code

[Swift] Singleton Pattern

진태우 2021. 2. 13. 19:33

 

Singleton Pattern에 대해 공부한 내용을 정리해 보려고 합니다.

 

- 정의

싱글톤 패턴은 클래스 객체가 하나만 인스턴스화 되도록 보장하는 디자인 패턴입니다.

 

- 특징

  1. 어플리케이션 내에 하나만 존재해야 하는 객체일 경우 사용

  2. static 변수로 선언하기 때문에 lazy하게 생성됨. 즉 사용하기 전엔 메모리에 올라가지 않음.

  3. 생성되면 어플리케이션이 종료되기 전까지 메모리에 유지

  4. 상수값이기 때문에 값의 변화가 없어 thread-safe가 보장됨.

  5. 하나의 인스턴스를 사용하기 때문에 인스턴스 내부의 데이터를 공유할 수 있음.

    어디서든 접근 및 수정이 가능하다는 의미.

 

- 코드

아래는 싱글톤을 구현하는 예제입니다.

class Singleton {
    // static -> lazy하게 생성
    // let -> thread-safe 보장
    static let shared = SingleTon()
		
    // private 권한을 설정하여 외부에서 인스턴스를 생성할 수 없게 함
    private init() {}    
}

 

아래와 같이 네트워크 관리 객체를 만들어 사용할 수 있습니다.

class NetworkManager {
    static let shared = NetworkManager(baseURL: API.baseURL)

    let baseURL: URL

    private init(baseURL: URL) {
        self.baseURL = baseURL
    }
}

// 싱글톤 인스턴스 호출
print(NetworkManager.shared)

 

만약 싱글톤 객체 생성시 더 복잡한 설정이 필요하다면 아래와 같이 할 수 있습니다.

 

class NetworkManager {
    private static var sharedNetworkManager: NetworkManager = {
        let networkManager = NetworkManager(baseURL: API.baseURL)

        // 필요한 초기화 코드

        return networkManager
    }()

    let baseURL: URL

    private init(baseURL: URL) {
        self.baseURL = baseURL
    }

    class func shared() -> NetworkManager {
        return sharedNetworkManager
    }

}

// 싱글톤 인스턴스 호출
print(NetworkManager.shared())

 

Cocoa 프레임워크에서 많은 싱글톤 패턴을 사용하고 있습니다.

 

let application = UIApplication.shared

let sharedURLSession = URLSession.shared

let defaultFileManager = FileManager.default

let standardUserDefaults = UserDefaults.standard

let defaultNotification = NotificationCenter.default

let defaultPaymentQueue = SKPaymentQueue.default()

 

- 주의

싱글톤은 많이 사용되는 디자인 패턴입니다. 하지만 안티 패턴으로 간주되기도 합니다.

싱글톤 인스턴스를 어디서든 쉽게 접근하고 수정할 수 있기 때문에 많은 곳에서 사용할 경우, 부작용이 발생할 수 있습니다. 또한 적은 양의 코드 수정으로도 다른 요소에서 버그가 발생될 수 있습니다.

때문에 상황에 따라 잘 고려해서 사용해야 편리한 도구가 될 수 있습니다.

 

 

 

- Reference

https://cocoacasts.com/what-is-a-singleton-and-how-to-create-one-in-swift

https://cocoacasts.com/are-singletons-bad/

'Swift > Clean Code' 카테고리의 다른 글

[Swift] 보기 좋게? UIViewController 만들어 보기  (0) 2021.01.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함