Swift Singleton Pattern (활용 및 장단점)

hoBahk·2022년 3월 29일
0

Design Pattern

목록 보기
2/2

안녕하세요

오늘은 Singleton에 대해서 알아보려고 합니다!

1. Singlton Pattern이 무엇인가?

이름부터 Single로 시작을 합니다. 그럼 뭔가 하나라는 뜻이겠죠?
Singleton Pattern은 한 개의 클래스로 만드는 객체는 단 한개여야만 합니다.
무슨말이나면.. 클래스의 인스턴스를 하나만 생성하고 프로퍼티를 static으로 지정하여 전역에서 참조할 수 있도록 하는 편의를 제공합니다.

예제코드

그럼 어떻게 만드는 것인지 한번 보겠습니다.

Sinlgleton 클래스

class AppSetting {
  static let shared = AppSetting()
  private init { }
  
  var isMute: Bool = false 
}

사용

AppSetting.shared.isMute = true

전역으로 공유할 클래스를 만들어 줍니다.
그리고 나서 자기 자신의 인스턴스를 Static let 으로 생성합니다.
그렇게 되면 사용 예제 처럼 자기 자신의 인스턴스를 생성한 프로퍼티인 shared을 통해서 다른 프로퍼티와 메서드에 접근할 수 있습니다.
private init { }을 한 이유는 해당 클래스의 인스턴스를 생성하지 못하도록 init을 private 처리를 해준 것입니다.

Singleton 디자인 패턴을 활용하는 예

iOS에서 Singleton을 활용하는 예를 찾아보았습니다.

  • UIScreen.main
  • UserDefaults.standard
  • UIApplication.shared
  • FileManager.default
  • NotificationCenter.default
  • URLSession.shared

위와 같이 공통된 객체를 여러개 생성해서 사용해야하는 경우에 Singleton하나만 생성해서 공유하도록 할 때 사용하면 좋을 것 같습니다!

Singleton 장단점

Singleton Pattern의 장단점입니다!

장점

  • 인스턴스를 하나만 생성하므로 메모리 낭비를 방지할 수 있고 관리가 편하다.
  • Singleton으로 생성한 인스턴스는 전역 인스턴스이기 때문에 다른 클래스들과 공유가 쉽다.
  • 한 번 만들어지면 메모리를 할당하고 초기화 하는 과정이 단축되어 다시 접근할 때 더 빠르다.

단점

  • Singleton Instance가 많은 곳에서 참조될 경우에 다른 클래스의 Instance들 간 결합도가 높아져 개방 폐쇄 원칙(OCP)에 위배 된다.
  • 전역에서 접근을 할 수 있다보니 여러 곳에서 생각보다 많이 사용될 수 있어 시간이 지나면 어디어디에 Singleton이 연결되어 있는지 확인 하기 어려워진다.
  • 전역으로 접근할 수 있기 때문에 접근 순서를 정확히 파악하고 있어야 한다.
  • 따라서 수정과 테스트가 어려워진다.

Swift의 Singleton

Swift이전의 Objective-C에서의 Singleton은 dispatch_once를 이용해 한번만 불리도록 하는 작업을 해야합니다.
왜냐하면, MultiThread 환경에서는 Singleton을 생성할 때 Thread-Safe하지 않기 때문에 여러 쓰레드가 동시에 Singleton을 생성할 수도 있게 됩니다.

하지만!!

Swift에서는 static을 사용하여 타입프로퍼티로 Instance를 생성하게 되면 dispatch_once가 자동으로 적용되기 때문에 별도의 코드가 없어도 Thread-Safe하게 Singleton을 생성할 수 있습니다.
또한, static을 사용하면 lazy한 효과가 있어 사용 시점에 초기화가 되기 때문에 사용하지 않는다면 메모리에 올라가지 않고 처음 사용하는 시점에 메모리에 올라가게 됩니다.

애플문서를 보게 되면..

NOTE
Unlike stored instance properties, you must always give stored type properties a default value. This is because the type itself doesn’t have an initializer that can assign a value to a stored type property at initialization time.
Stored type properties are lazily initialized on their first access. They’re guaranteed to be initialized only once, even when accessed by multiple threads simultaneously, and they don’t need to be marked with the lazy modifier.

타입 프로퍼티로 선언하게되면 lazy하게 되는지는 지금 처음 알게 된 것 같습니다..!

Singleton을 공부하면서 SOLID에 대해서도 다시 한 번 보게 되었네요..!
다음에는 SOLID에 대해서 포스팅 하겠습니다.

감사합니다.

profile
호박에 줄 그어서 수박 되는 성장 드라마

0개의 댓글