THIS IS ELLIE

클래스 싱글톤 vs 구조체 싱글톤 본문

개발/Swift

클래스 싱글톤 vs 구조체 싱글톤

Ellie Kim 2021. 12. 5. 20:30

클래스 싱글톤과 구조체 싱글톤을 차이점을 알아보겠습니다.


비교를 하기 위해 먼저 클래스 싱글톤을 만들어줍니다.
private init()을 해준 이유는 https://hyerios.tistory.com/23 해당 포스팅에서도 언급했지만
다른 곳에서 또 다른 인스턴스를 생성하지 못하도록 하기 위함입니다. (싱글톤 특성)
그리고 value변수를 생성하고 0으로 초기화해줍니다.
currentValue함수를 생성해 현재 value값을 출력해주도록 합니다.

class ClassSingleton {
    static let shared = ClassSingleton()
    private init() {}
    
    var value = 0
    
    func currentValue() {
        print("class Singleton: \(value)")
    }
}

 

그리고 구조체 싱글톤을 만들어줍니다.
위와 동일하게 value변수를 생성하고 0으로 초기화해줍니다.
currentValue를 생성해 현재 value값을 출력해주도록 합니다.

struct StructSingleton {
    static let shared = StructSingleton()
    private init() {}
    
    var value = 0
    
    func currentValue() {
        print("struct Singleton: \(value)")
    }
}

클래스 싱글톤 테스트

let classSingleton1 = ClassSingleton.shared
classSingleton1.currentValue()
classSingleton1.value = 1
let classSingleton2 = ClassSingleton.shared
classSingleton2.currentValue()
Memory.address(object: classSingleton1)
Memory.address(object: classSingleton2)

classSingleton1을 생성해줍니다.
currentValue함수를 호출해줍니다.
초기화 값 그대로 0이 출력되는 것을 확인할 수 있습니다.
그리고 classSingleton1에 value변수의 값을 1로 변경해줍니다. (그럼 classSingleton1에 value변수는 0에서 1로 변경됩니다)

classSingleton2를  생성해줍니다. 
currentValue함수를 호출해줍니다.
1이 출력되어있습니다.

각각의 주소를 출력해보면 동일한 주소 값을 출력하죠?
클래스는 reference type이기 때문에 classSingleton1이나 classSingleton2나 동일한 인스턴스를 가리킵니다.

 

 

구조체 싱글톤 테스트

var structSingleton1 = StructSingleton.shared
structSingleton1.currentValue()
structSingleton1.value =  1
var structSingleton2 = StructSingleton.shared
structSingleton2.currentValue()
Memory.address(variable: &structSingleton1)
Memory.address(variable: &structSingleton2)

structSingleton1을 생성해줍니다.
currentValue함수를 호출해줍니다.
초기화 값 그대로 0이 출력되는 것을 확인할 수 있습니다.
그리고 structSingleton1에 value변수의 값을 1로 변경해줍니다. (그럼 structSingleton1에 value변수는 0에서 1로 변경됩니다)

structSingleton2를  생성해줍니다. 
currentValue함수를 호출해줍니다.
여기서는 클래스와 다르게 0이 출력되어있습니다.
왜?

각각의 주소를 출력해보면 다른 주소 값을 출력하죠?
구조체는 value type이기 때문에 structSingleton1 그리고 structSingleton2은 별개의 인스턴스를 가집니다.
각각 다른 인스턴스니 클래스 싱글톤과 다르게 멀티스레드 환경에 대한 걱정은 없겠네요.

 

결론: 구조체가 싱글톤? 모순이여
애플에서는 싱글톤을 아래와 같이 설명하는데 같은 인스턴스를 리턴한다는 점을 주목한다면 구조체 싱글톤이라는 말은 맞지 않는 것 같습니다. 굳이 칭하자면 싱글톤처럼 쓰는 구조체?라고 표현하는 게 더 맞을지도...ㅎㅎ (언제 어디서든 접근 가능하지만, 값이 공유되지도 않아 싱글톤처럼 쓴다고 하기도 어려움ㅎㅎ)
A singleton class returns the same instance no matter how many times an application requests it.

 

resource:
https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html

 

반응형

'개발 > Swift' 카테고리의 다른 글

Swift Extensions  (2) 2024.05.03
스위프트 Combination  (0) 2021.07.02
스위프트 Intersperse함수  (0) 2021.05.30
스위프트 mutating 키워드  (0) 2020.11.12
스위프트 배열 크기  (0) 2020.11.09