오늘은 싱글톤 패턴에 대해서 알아보자.
class NormalSetting {
var audioSound = 5
}
// in mainView
let mainViewSetting = NormalSetting()
mainViewSetting.audioSound = 1
// in musicView
let musicViewSetting = NormalSetting()
musicViewSetting.audioSound = 10
// in textView
let textViewSetting = NormalSetting()
textViewSetting.audioSound = 0
오디오 음량을 관리하는 NormalSetting
class를 하나 만들어줬다.
mainView
, musicView
, textView
화면에서 각각 오디오 음량을 관리하려고 한다.
Singleton
을 사용하지 않는다면 각각의 화면에서 오디오 음량을 설정해주기 위해 화면마다 NormalSetting
인스턴스를 생성한 후 관리해줘야한다.
class SingletonSetting {
static let shared = SingletonSetting()
private init() {}
var audioSound = 5
}
// in mainView
SingletonSetting.shared.audioSound = 1
// in musicView
SingletonSetting.shared.audioSound = 10
// in textView
SingletonSetting.shared.audioSound = 0
Singleton
을 사용한다면 각 화면에서 NormalSetting
인스턴스를 생성하지 않고 해당 타입 즉, SingletonSetting
class에 접근해 오디오 음량을 설정할 수 있다.
왼쪽 도식이 Singleton을 사용하지 않은 경우이고, 오른쪽 도식이 Singleton을 사용한 경우이다.
Singleton을 사용하면 여러 view가 Singleton Setting
class에 정의된 단 한개의 audioSound
에 접근하게된다.
class SingletonSetting {
static let shared = SingletonSetting()
private init() {}
var audioSound = 5
}
Singleton
패턴을 적용한 코드가 위와 같다는데 하나씩 뜯어보자.
static let shared = SingletonSetting()
static
키워드가 붙어있다!
그러므로 Type Property
임을 알 수 있다.
(타입 프로퍼티가 뭔지 모른다면 이전 포스팅을 보고오길 추천한다!)
Type Property
의 특징은 해당 타입에서 단 하나만 존재한다.
그러므로 SingletonSetting
class에서 shared
프로퍼티는 단 하나만 존재함을 보장한다.
Type Property
는 지연 생성(lazy)되기 때문에 처음 SingletonSetting
class를 생성하기 전까지는 메모리에 올라가지 않는다.
shared
는 싱글톤 인스턴스에 암묵적으로 쓰이는 이름이다.
(default
, standard
도 마찬가지)
private init() {}
private
키워드가 붙어있다!
private
이 붙었으므로 SingletonSetting
class에서만 init()
을 사용할 수 있도록 제한해준다.
즉, 다른 class에서 SingletonSetting
인스턴스를 생성할 수 없도록 제한한다.
Singleton
인스턴스가 다양한 부분에서 참조되어 많은 일을 하거나 데이터를 공유할 경우 다른 클래스의 인스턴스들 간 결합도가 높아져 설계에 위험이 존재하게 된다.
또한, 사용하지 않을때에도 메모리를 항상 잡고 있다.
늘 그렇듯 선택의 문제이다.
장점과 단점을 잘 생각해 보고 어떤 선택이 좀 더 합리적인지 잘 따져야할거 같다.
싱글톤에 대해서 알아봤다.
싱글톤을 적절하게 잘 사용하면 좋을거 같다.
그럼 이만👋