관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] 스위프트에서의 singleton 싱글톤 동작 이해하기 (lazy, thread safe) 본문

iOS 응용 (swift)

[iOS - Swift] 스위프트에서의 singleton 싱글톤 동작 이해하기 (lazy, thread safe)

jake-kim 2022. 12. 15. 02:02

싱글톤 패턴

  • 인스턴스는 오직 한개를 사용하고, 라이프사이클 동안 절대 해제되지 않는 하나의 인스턴스 유지
    • swift에서는 static와 함께 전역변수로 선언하면 lazy하게 동작하는 장점이 존재
    • swift에서는 멀티 스레드에서 singleton을 사용해도 thread safe한 장점이 존재 (아래에서 계속)
public class MyClass {
    static let shared = MyClass()
    private init() {}
    
    public func printSome() {
        print("some")
    }
}

MyClass.shared.printSome()

swift에서의 싱글톤 동작

  • singleton 패턴은 SRP(Single Responsibility Principle) 원칙을 위반
    • SRP원칙이란 하나의 컴포넌트 (MyClass)는 사용하는 쪽에서 여러 actor가 접근하여 사용할 수 있게되어, 여러 actor를 대상으로 기능을 제공하는 구조로 변할 가능성이 높음
    • SRP 원칙을 위반하지만 사용하는 이유는, 코드의 유연함과 가독성이 높기 때문
  • singleton 패턴은 메모리에 항상 올라와 있으며, 해제되지 않는점에 대해서 메모리 효율상 단점이 존재
  • 일반적인 singleton은 Thread safe하지 않지만 swift에서는 thread safe
    • swift에서 전역변수를 사용하여 인스턴스를 사용하는 경우, GCD의 dispatch_once라는 것이 자동으로 적용되어 인스턴스가 생성되어 자동으로 thread safe한 방법으로 접근
    • dispatch_once를 통해 atomic하게 초기화가 가능
    • 스위프트에서는 static 키워드로 설정된 타입 프로퍼티는 lazy property처럼 처음 접근할 때 초기화로 동작

https://developer.apple.com/swift/blog/?id=7

* swift가 아닌 경우, thread safe하지 않은 이유는 1번 스레드와 2번 스레드가 동시에 instance를 호출할 때 인스턴스가 동시에 만들어지는 것 (= thread safe하지 않음)

 

* 참고

https://developer.apple.com/swift/blog/?id=7 

https://www.swift.org/migration-guide-swift3/

https://velog.io/@tamxt4047/singleton-pattern

Comments