매주 AppCoda Weekly 라는 메일구독 서비스를 통해서 iOS 및 디자인에 대한 이슈와 소식을 접하고 있습니다. 그러던 중 며칠 전 받은 이슈 중에서 What's the difference between a singleton and a shared instance in Swift? 라는 게시물을 접하게 되었고, 이를 한글로 번역해서 게시글로 작성하고자 합니다. 영어로 읽히는 대로? 영어를 보고 한글로 읽히는대로? 네.. 그냥 제가 읽히는 대로 적어놨기 때문에 번역이 잘못되었거나, 제가 잘못 이해한 부분이 있을 수도 있지만 그런 부분은 댓글로 알려주시면 바로 수정해볼게요 😄😄
우리가 iOS에서 접할 수 있는 흔한 패턴은 앱 어디에서나 접근할 수 있는 인스턴스를 정의하는 패턴입니다. 그 예시로는 URLSession.shared, FileManager.default, 그리고 UserDefaults.standard 가 있죠.
이 객체들은 shared instance 또는 globally available instance 라고 할 수 있습니다. 한글로 직역하자면 공유된 인스턴스, 어디서나 이용 가능한 인스턴스... 뭐 그렇게 되겠죠? 그리고 이런 shared instance를 정의하기 위해서 일반적으로 아래와 같이 구현할 수 있습니다.
보통 이렇게 구현한 걸 개발자들은 Singleton (싱글턴), 또는 Singleton Instance (싱글턴 인스턴스) 라고 부릅니다.
싱글턴 패턴은 개발자가 어떠한 특정한 객체에 대해서 Application Context 내에 단 하나의 인스턴스만 가질 수 있도록 하는 패턴인데요. 이 말을 비롯해서 위 코드를 다시 보면, DataProvider가 실제로는 싱글턴 객체가 아니라는 것을 알 수 있습니다.
왜 그러냐면요.. 위 코드는 우리가 아래같은 코드를 작성해도 문제 될 게 전~혀 없는 코드기 때문이죠😂
이렇게 DataProvider 에 대한 인스턴스를 여러 개 생성할 수 있기 때문에 DataProvider.shared 가 싱글턴 객체가 아니라고 할 수 있습니다. 여기서 DataProvider.shared 는 그냥 단순히 DataProvider 와 연결된 간편한 공유 인스턴스라고 할 수 있죠. 즉, 이 shared instance에 DataProvider.shared 를 통해서 쉽게 접근할 수 있다는 말이지, 단 하나의 유일한 인스턴스라는 말 (= 싱글턴 인스턴스) 이 아니라는 말입니다.
여기서 정말로 올바른 싱글턴 객체를 만들고자 했다면, 우리는 DataProvider의 initializer를 private으로 감싸주었어야 했습니다. initializer가 private으로 감싸져있다는 말은, 더이상 새로운 인스턴스를 생성할 수 없다는 말과 같으니까요 :)
아 물론.. 아직도 DataProvider에 추가적인 static property를 만들어서 하나 이상의 인스턴스를 만들어낼 수는 있습니다. 굳이굳이 만들자면 말이죠ㅎㅅㅎ.. 하지만 위에서 다룬 코드의 차이점을 통해 충분히 말하고자 하는 바를 이해할 수 있다고 믿어요 🌝
여기서 한 가지 중요한 점은 static property가 lazy하게 할당되어도, 이는 thread-safe 하다는 점입니다. 즉, 여러 thread가 static property에 동시에 접근한다고 해도 여러 인스턴스가 생기지 않고 atomic하다는 것을 말합니다.
방금 제가 말한 것에 대해서 좀 더 많은 것을 알고 싶다면 Jesse Squires의 Swift globals and static members are atomic and lazily computed 라는 게시물을 보는 걸 추천해요!! 이 게시물까지 다 번역해오기엔 너무 시간이 오래걸리고 귀찮아서 제가 그냥 대충 읽고 왔는데, 스위프트에서 사용되는 static let 은 atomic하고 immutable하기 때문에 thread-safe 하다고 합니다‼️
그리고 아주 만약에 프로그래밍에서 말하는 atomic 에 대해서도 뭔지 모르겠다면 What does "atomic" mean in programming? 이라는 게시물도 추천합니다. 이 게시물도 제가 조금 엿보고 왔는데, 저는 이 게시물의 중요한 키워드가 "one at a time" 이라고 생각해요. 즉, property에 접근하거나 수정하는 게 atomic 하다는 말은 한 번에 하나의 작업만 수행될 수 있다는 말이 되죠 :)
아무튼 결론적으로! Singleton은 우리가 단 하나의 인스턴스만을 가질 수 있는 객체를 말합니다. Shared Instance는 그냥 단지 접근하기 편리한 인스턴스일 뿐이지 인스턴스가 단 하나만 있을 필요는 없는 그런 거다~ 뭐 이런 말이죠.
'iOS > iOS' 카테고리의 다른 글
이미지 캐시 처리와 NSCache (4) | 2021.06.23 |
---|---|
CATransform3D 애니메이션 (1) (0) | 2021.05.15 |
Local Notification (로컬 푸시) 구현하기 (0) | 2021.05.10 |
커뮤니케이션 패턴 (Delegate, Notification, KVO, Target-Action) (0) | 2021.05.04 |
Promises (0) | 2021.04.29 |
댓글