싱글톤패턴이란?
- 앱 구현시 유일하게 한개만 존재하는 객체가 필요한 경우에 사용
- 한번 생성된 이후에는 앱이 종료될때까지 유일한 객체로 메모리에 상주
class MySingleTone {
static let shared = MySingleTone() // 자신의 객체를 생성해서 타입프로퍼티로 선언
var num = 0
}
MySingleTone.shared // Type.Property로 접근
// 참조형식이기 때문에 메모리 주소를 공유하여 앱 생명주기 내내 단 하나의 인스턴스만 존재
// 값형식은 해당 인스턴스를 복사하는 형식이기 때문에 인스턴스가 여러개 생길 가능성이 있음
// 그래서 싱글톤패턴은 값형식인 struct나 enum에선 사용하지 않음
var singleTone1 = MySingleTone.shared // 변수에 할당하더라도 하나의 메모리 주소만 가르킴
var singleTone2 = MySingleTone.shared
MySingleTone.shared.num // 0
singleTone1.num // 0
singleTone2.num // 0
singleTone1.num = 10
MySingleTone.shared.num // 10
singleTone1.num // 10
singleTone2.num // 10
싱글톤 패턴은 구조체에선 사용을 못할까?
- 못함
- 값형식은 메모리주소를 공유하는 개념이 아닌 값 자체를 복사해버리기 때문에
- 새로운 인스턴스가 생길 가능성이 있음
struct MySingleTone {
static let shared = MySingleTone() // 자신의 객체를 생성해서 타입프로퍼티로 선언
var num = 0
}
MySingleTone.shared // Type.Property로 접근
// 참조형식이기 때문에 메모리 주소를 공유하여 앱 생명주기 내내 단 하나의 인스턴스만 존재
// 값형식은 해당 인스턴스를 복사하는 형식이기 때문에 인스턴스가 여러개 생길 가능성이 있음
// 그래서 싱글톤패턴은 값형식인 struct나 enum에선 사용하지 않음
var singleTone1 = MySingleTone.shared // 변수에 할당하면 인스턴스가 복사되기 때문에
var singleTone2 = MySingleTone.shared // 인스턴스가 여러개 생김 -> 싱글톤패턴이 깨짐
MySingleTone.shared.num // 0
singleTone1.num // 0
singleTone2.num // 0
singleTone1.num = 10
MySingleTone.shared.num // 0
singleTone1.num // 10
singleTone2.num // 0
생성자를 통해서 새로운 인스턴스를 만들 수 있지 않음?
- private init() 설정을 통하여 생성자를 외부에서 접근하지 못하게 하는것으로
- 새로운 인스턴스 생성을 막을 수 있음
class MySingleTone {
static let shared = MySingleTone() // 자신의 객체를 생성해서 타입프로퍼티로 선언
private init() { }
var num = 0
}
// let newSingletone = MySingleTone() // init을 private하게 해줬으므로 생성자 접근이 불가해짐
언제씀?
- 앱 구현시 유일하게 단 하나만 존재해야 하는 객체가 있어야 할 경우에 사용
// 애플에서 구현해놓은 싱글톤 패턴
UIScreen.main
UserDefaults.standard
UIApplication.shared
문제점
- 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유할경우 다른 클래스의 인스턴스간 결합도가 높아져 수정과 테스트가 어려워짐