이전에 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도 그렇다고 하네.

중간에 이상한 길로 빠졌다~! 아무튼!
그런데, 이 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
이해를 돕기 위해 각 타입에 따른 메모리 구조를 그림으로 그려보자면 다음과 같다.

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

반면 구조체의 경우에는 각 변수가 별개의 인스턴스를 가지므로, 하나의 값이 변경되어도 각 값만 변경될뿐이라 싱글톤 패턴을 사용할 수 없다. 정확히 말하자면, 구조체로 싱글톤 패턴을 구현하면 안 된다! 가 옳을 것이다.
참고 자료
싱글톤 패턴에 무상태(stateless)가 필요한 이유
📖 ✏️ TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.
velog.io
[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 |