본문으로 바로가기

싱글톤패턴이란?

- 앱 구현시 유일하게 한개만 존재하는 객체가 필요한 경우에 사용

- 한번 생성된 이후에는 앱이 종료될때까지 유일한 객체로 메모리에 상주

 

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

문제점

- 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유할경우 다른 클래스의 인스턴스간 결합도가 높아져 수정과 테스트가 어려워짐

 

 

전체코드: https://github.com/jmindevelper/swift_designpattern/blob/main/생성패턴/SingleTonePattern.playground/Contents.swift