단 하나의 인스턴스를 가지는 클래스를 이용한 디자인 패턴.
class Car {
var color = "Red"
}
let myCar = Car.singletonCar
myCar.color = "Blue"
let yourCar = Car.singletonCar
print(yourCar.color) // Red
일반적으로 클래스를 통해 생성한 인스턴스는 이렇다. Car 클래스로 myCar와 yourCar라는 2개의 인스턴스를 생성했다. myCar의 color 속성을 Blue로 변경해도 다른 인스턴스인 yourCar의 color에는 아무런 영향을 미치지 않는다.
class Car {
var color = "Red"
static let singletonCar = Car()
private init(){}
}
class A {
init() {
Car.singletonCar.color = "Brown"
}
}
class B {
init() {
print(Car.singletonCar.color)
}
}
let a = A()
let b = B() // Brown
이전의 Car클래스와는 다르게 singleronCar라는 인스턴스를 클래스 안에 static 키워드를 사용해서 전역적으로 사용할 수 있게 만들고 private init을 넣어 다른곳에서 Car클래스를 초기화 할 수 없게 만들었다.
그리고 A클래스에서 singletonCar의 color 속성을 Brown으로 변경했고 B클래스에서는 singletonCar의 color속성을 프린트하여 Brown이라는 출력값을 얻었다.
Class는 참조 타입이므로 언제나 같은 singletonCar 인스턴스에 접근할 수 있는것이다. 그렇기 때문에 싱글톤 패턴은 프로젝트 내에서 하나의 인스턴스를 공유하고 싶을 때 사용한다.
let defaults = UserDefaults.standard
let sharedURLSession = URLSession.shared
위와 같은 경우가 싱글톤이라고 알려져 있지만 정확히는 싱글톤이 아니라 공유 인스턴스다.
싱글톤은 단 하나의 인스턴스만을 가져야 하는데 위의 경우는 인스턴스를 여러개 생성할 수 있기 때문이다.