[Swift] Singleton Pattern은 왜 class로만 만들까?

이전에 Singleton Pattern의 개념은 이전 블로그에서 정리한 게 있기에 자세한 건 요 아래 블로그 참고!

 

 

https://blog.naver.com/01unknown/223091350958

 

[swift] Singleton Pattern

Allen Swift 문법 마스터 스쿨을 통해 공부하고 있습니다~! 싱글톤 패턴은 유일하게 1개만 존재하는 객체...

blog.naver.com

 

 

 

그래도! 간단하게 정리하고 넘어가 보자면~

 

 

 

 

Singleton Pattern

한 프로그램에서 단 하나의 인스턴스를 생성하여 여러 곳에서 재사용하는 인스턴스로, 새로운 인스턴스를 만들지 않기 때문에 메모리 방지를 예방할 수 있다. 주로 각 뷰 컨트롤러마다 새로운 값을 적용해야 하는 게 아닌, 동일한 값을 가져다 쓰는 경우에 사용한다.

추가적으로, 싱글톤 패턴은 무상태(stateless)여야 한다. 즉, 싱글톤을 설계할 때 객체의 상태를 유지하는 설계를 반드시! 피해야 한다는 것이다. 왜냐하면 앞서 말했듯 싱글톤 패턴은 여러 클라이언트가 하나의 객체를 공유하므로, 싱글톤 패턴에서 하나의 객체가 갖는 상태를 가지게 된다면, 이 상태를 여러 클라이언트가 공유하는 경우가 생길 수 있기 때문이다.

근데 그럼 singleton pattern이 적용된 클래스에서 여러 곳에서 공유하는 용도로 선언한 저장 속성 프로퍼티는 singleton pattern의 stateless 상태여야 한다! 라는 조건에 어긋나는 건가?

... ... 아마 그런 것 같다.

다른 블로그 글을 봐도 그렇구? GPT도 그렇다고 하네.

etc-image-0

 

중간에 이상한 길로 빠졌다~! 아무튼! 

 

 

 

 

그런데, 이 Singleton Pattern을 구조체로 만들 수는 없을까?

 

결론부터 말하자면, 불가능하다!

참조타입인 클래스와 달리, 구조체는 값타입이기 때문이다.

 

 

 

기본적인 싱글톤의 예제이다.

각 변수가 동일한 싱글톤을 가리키고 있다는 걸 보여주기 위해 저장 속성 프로퍼티를 하나 선언했다. 앞서 아리송~ 했던 singleton pattern의 stateless한 속성에는 어긋나지만~~! 아무튼.

class Singleton {
    var number = 2
    static let shared = Singleton()
    
    private init() { }
    
}

let singleton1 = Singleton.shared
let singleton2 = Singleton.shared

print(singleton1.number, singleton2.number) // 2 2
singleton1.number = 5
print(singleton1.number, singleton2.number) // 5 5

 

 

 

요 예시를 struct로 바꿔보면...

struct Singleton {
    var number = 2
    static let shared = Singleton()
    
    private init() { }
    
}

var singleton1 = Singleton.shared
var singleton2 = Singleton.shared

print(singleton1.number, singleton2.number) // 2 2 
singleton1.number = 5
print(singleton1.number, singleton2.number) // 5 2
print(singleton1, singleton2) // Singleton(number: 5) Singleton(number: 2)

본래 싱글톤의 목적처럼 단 하나의 인스턴스를 공유하는 것이 아닌, 그대로 값이 복사되어 버린다.

이는 앞서 말했듯 구조체와 클래스가 자신의 인스턴스를 찍어내는 방식이 다르기 때문인데,

이 역시 이전에 블로그 글을 작성한 적이 있기에... 블로그 링크를 첨부해 놓겠다. ^_^ b

 

 

https://blog.naver.com/01unknown/223116652435

 

[Swift] Value type / Reference type

Swift의 타입은 Value type과 Reference type으로 나뉜다. Value Type Int, String, Double 같은 ...

blog.naver.com

 

 

 

 

 

 

 

이해를 돕기 위해 각 타입에 따른 메모리 구조를 그림으로 그려보자면 다음과 같다.

 

etc-image-1

참조 타입인 클래스의 경우에는 두 변수가 인스턴스의 주솟값을 가지고 있어 싱글톤 패턴이 원하는대로 어느 변수에서든 단 하나의 인스턴스에 있는 값들을 수정하고, 같은 값을 공유할 수 있다.

 

 

 

etc-image-2

반면 구조체의 경우에는 각 변수가 별개의 인스턴스를 가지므로, 하나의 값이 변경되어도 각 값만 변경될뿐이라 싱글톤 패턴을 사용할 수 없다. 정확히 말하자면, 구조체로 싱글톤 패턴을 구현하면 안 된다! 가 옳을 것이다. 

 

 

 

 

 

 

 

참고 자료 

https://velog.io/@woply/%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4%EC%97%90-%EB%AC%B4%EC%83%81%ED%83%9Cstateless%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0

 

싱글톤 패턴에 무상태(stateless)가 필요한 이유

📖 ✏️ TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.

velog.io

https://medium.com/@Jager-yoo/swift-%EB%8B%A4%EC%8B%9C-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%8B%B1%EA%B8%80%ED%84%B4-singleton-%ED%8C%A8%ED%84%B4-a013757775bc

 

[Swift] 다시 공부하는 싱글턴(Singleton) 패턴

아마 디자인 패턴 중에서, 가장 유명하고 많이 사용되는 건 싱글턴(Singleton) 패턴이 아닐까 싶습니다.

medium.com

https://so-kyte.tistory.com/169

 

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

싱글톤 객체를 클래스로 구현할 때와 구조체로 구현할 때 무슨 차이가 있을까? 그 전에 .. 싱글톤 패턴 다시 정리 .. 내 입에서 처음부터 끝까지 아무것도 보지 않고 나올 때까지 정리 .. 개념 단

so-kyte.tistory.com

 

 

'iOS' 카테고리의 다른 글

[iOS] Advances in UICollectionVIew  (0) 2023.09.23
[Swift] ARC(Automatic Reference Counting) (2/2)  (2) 2023.09.02
[SeSAC] August 9, 2023  (0) 2023.08.09
[Swift] instance / Type  (0) 2023.08.01
[Swift] Enum  (0) 2023.07.30