brunch

You can make anything
by writing

C.S.Lewis

by 이준원 May 20. 2016

싱글톤 작성 in Swift

swift로 바르게 작성하기

iOS 앱을 만들다 보면, 싱글톤으로 관리해줘야 할 놈들이 있다. 


근데, 싱글톤이 뭐여..

싱글톤은 간단히 얘기하면, 유니크한 객체인데..... 

어찌 보면, 인간이랑 비슷한 것 같기도.. 이게 무슨말이냐하면요... 

내가 분신이 있다면 부산, 대전, 서울에서 한 시점에 밥을 먹을 수 있지만, 나에게 분신 따윈 없고, 나는 나이기에 인생에 있어서 나는 나로서 유니크하다. (나도 뭔소리 인지.. 무튼 나는 나로서 유일무이하다)


싱글톤이란 녀석도 프로그램 사이클에서 유니크하게 관리될 객체인데요.. 

iOS 에서는 NSNotificationCenter, UIApplication 녀석들이 대표적인 친구들이 있죠. 


그럼 싱글톤을 Objective-C로 작성하면,, 요렇게

objective-c 

유일무이한 놈이여야 하기때문에, 앱 주기 동안 단한번만 만들어서 쓸려면 dispatch_once를 이용해서 생성해야 Thread-safe하게 만들수 있다. 


옥희 그러면, 이제 swift로 만들어보자. 

swift

이것은 위에 Objective-C로 구현하것을 swift로 아주 정직하게 포팅한것이다. 

이렇게 바꿀꺼면 swift 왜쓰냐는 말 듣기 아주 좋은 구현방법이다. 


이것보다 조금더 미려한 방법이 있었다. swift 1.2버젼 이전에는..... 아래처럼

swift

나는 swift1.2부터 사용했기 때문에, 그전 버젼에서 class 가  static variable을 지원 못하는지 몰랐었다. 

그 이후에 class 가  static variable을 지원하면서 아래처럼 초 간단 심플하게 구현할수가 있게 됨. 


근데, 여기서 dispatch_once 어디갔어? 라고 생각이 들었는데,, 이것은 애플형님들이 아래와 같이  swift blog에 포스트 해놨다고한다


“The lazy initializer for a global variable (also for static members of structs and enums) is run the first time that global is accessed, and is launched as `dispatch_once` to make sure that the initialization is atomic. This enables a cool way to use `dispatch_once` in your code: just declare a global variable with an initializer and mark it private.”

— Apple's Swift Blog


즉, 지연초기화(lazy initializer)를 통해 생성되는 글로벌 변수에 대해서는 dispatch_once를 통해서 독립적으로 생성됨을 확인할수가 있다. 


따라서, 이제 싱글톤을 저렇게 이쁘고 간단하게 작성을 할수가 있어요... in swift. 


참고)

제가 좀 무지하기 때문에 틀린내용은 알려주시면, 더 공부해서 수정토록 하겠습니다. :) 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari