본문 바로가기

Swift

[Swift] 싱글톤 패턴에서 구조체와 클래스의 차이

728x90

싱글톤 객체를 클래스로 구현할 때와 구조체로 구현할 때 무슨 차이가 있을까?

 

그 전에 .. 싱글톤 패턴 다시 정리 .. 

내 입에서 처음부터 끝까지 아무것도 보지 않고 나올 때까지 정리 .. 

 

개념

  • 단 하나의 인스턴스를 생성해서 여러 곳에서 공유되는 객체이다.

 

장점

  • 고정된 메모리 영역을 얻고, 새로운 인스턴스를 만들지 않기 때문에 메모리 낭비를 방지할 수 있다.

 

단점

  • 그러나, 한번 생성되면 deinit이 불가하므로 남용하면 안된다.
  • 또한, 멀티 쓰레드 환경에서 동기화 처리를 하지 않으면 문제가 발생할 수 있다.

 

🤔 그런데 말입니다.

구조체가 클래스보다 메모리 관리에 용이하기 때문에 구조체로 관리하는 것이 좋지 않을까?

왜 싱글톤 패턴에서 대부분 클래스를 사용할까? 

 

 

클래스와 구조체의 차이와 같다. 

당연한 말임.

 

class ClassSingleton {
    static let sharedInstance = ClassSingleton()
    private init(){}
    var state = 5
    func helloClass() { print("Class : \(state)") }
}

struct StructSingleton {
    static let sharedInstance = StructSingleton()
    private init() {}
    var state = 5
    func helloStruct() { print("Struct : \(state)") }
}

위와 같이 클래스/구조체로 구현한 싱글톤 패턴이 있다고 할 때,

 

let classSingleton = ClassSingleton.sharedInstance
classSingleton.state = 127
ClassSingleton.sharedInstance.helloClass()

var structSingleton = StructSingleton.sharedInstance
structSingleton.state = 127
StructSingleton.sharedInstance.helloStruct()

이렇게 각 클래스로 구현한 싱글톤, 구조체로 구현한 싱글톤에 대한 인스턴스를 만들고 해당 인스턴스로 프로퍼티에 접근해서 값을 변경해보자.

 

그리고 함수를 출력해보면,

클래스는 새로 변경한 값인 127로 출력이 되지만 구조체는 기존의 값인 5가 출력 되는 것을 확인할 수 있다.

 

✔️ 클래스는 참조 즉 메모리를 가르키지만 (같은 메모리를 바라보고 있기 때문에 변경이 이루어지고 변경된 값으로 출력)

✔️ 구조체는 복사할 뿐이다. (서로 다른 메모리를 바라보고 있고 기존의 것은 5이고, 수정된 것은 127인데, 출력은 기존의 것을 출력하고 있으므로 5의 값이 출력된다.)

(이런 경우에는 구조체로 구현된 싱글톤 패턴이 사실상 싱글톤 패턴이라고 볼 수 없다.)

 

➡️ 구조체가 싱글톤? 모순이다 모순 .. 허상 .. 허상인 것!!!

 

'Swift' 카테고리의 다른 글

[RxCocoa] 코코아 맛보기 .. 홀짝 .. ☕️  (0) 2022.10.31
Method Swizzling  (0) 2022.10.13
[Swift] Anti Pattern이 뭐고?  (0) 2022.10.13
[Swift] static을 언제 쓰는데?  (1) 2022.10.12
[Swift] class func VS static func  (0) 2022.10.12