일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- widgetkit
- c++
- Protocol
- 네트워크
- TCA
- uikit
- dispatchqueue
- 1일1알골
- spritekit
- composable architecture
- 리액트
- 영남대
- 알고리즘
- 멋사
- 문법
- 대외활동
- 스유
- 멋쟁이사자처럼
- 웹
- cs
- swift concurrency
- Swift
- 후기
- 백준
- 컴퓨터그래픽스
- 위젯킷
- widget
- 운영체제
- 스위프트
- SwiftUI
- Today
- Total
맛동산이
싱글톤 디자인패턴(Singleton Design), static과 타입프로퍼티(type Property) 본문
UIApplication.shared 라는 코드가 뭔지 몰라서 찾아보니 싱글톤이라는 디자인 패턴이며, 이것에 대해서 뭔지 몰라서 찾아보게 되었다.
싱글톤 패턴이란?(what is Singleton design pattern)
싱글톤이란, 단 하나의 인스턴스만을 생성해서 사용하는 디자인 패턴을 의미한다.
당연히 이러한 디자인 패턴을 이용하는데에는 다 장점이 있겠죠?
싱글톤 디자인 패턴, 하나의 User Info 라는 전역 인스턴스가 존재한다.
싱글톤의 장점
- 메모리 측면 : 단한번의 인스턴스가 생성되기 때문에, 메모리 관리가 편하고, 모종의 이유로 메모리가 해제되지 않는 memory leak 부분에서도 자유롭다. 또한 객체 접근시간이 줄어든다.
- 정보 공유 측면 : 하나의 인스턴스가 전역적으로 사용되기 때문에, 다양한 클래스에서 해당 인스턴스를 접근할수 있게 된다. 즉 하나의 클래스 인스턴스가 가지고 있는 프로퍼티나 메소드를 다양한 클래스에서 쉽게 접근 가능하다는 점이다.
싱글톤의 단점
- 구체클래스에 의존하게 되어서, ocp, dip 를 위반할 가능성이 높다.
- 구체 클래스 : new를 통해서 인스턴스 생성이 가능한 클래스 ↔ 추상클래스 : new를 통해서 객체 생성불가
- ocp(개방 폐쇠 원칙) : 소프트웨어 엔티티는 확장에 대해서는 열려있어야 하지만, 변경에 대해서는 닫혀있어야 한다. 즉 기존 코드를 변경하지않으면서 ( 기존 엔티티를 건들지 않으면서, 기능을 추가할수 있어야 한다는 것이다. )
- dip(의존성 역전 원칙) : 추상화에 의존해야하며, 구체에 의존하면 안된다는 원칙
- 테스트가 어렵다. 싱글톤 디자인패턴은 하나의 인스턴스가 데이터를 공유하고 있기 때문에, 데이터와 모델의 격리가 불가능하다. 따라서 테스트가 온전하게 수행되기 어렵는 단점이 있다.
싱글톤은 멀티스레드 환경에서 동시에 singleton 객체를 생성하면, 여러개의 객체가 생성되고 이는 Thread-safe(여러스레드가 접근했을때 문제가 발생하지 않는다)하지 않다.
스위프트에서의 Singleton?
스위프트는 static 키워드를 사용하여 타입프로퍼티로 생성하게 되면, 이러한 thread-safe한 문제에서 벗어날수 있다.
static, 타입프로퍼티에 대해서
static은 타입프로퍼티와 타입메소드를 지정하는 키워드이다.
타입프로퍼티란, 인스턴스 프로퍼티와 다르게, 그 타입에서 그대로 사용할수 있는 프로퍼티를 의미한다.
코드를 보면 이해가 쉬운데
인스턴스 생성
이렇게 static키워드를 사용하면 타입프로퍼티가 되는데, 이처럼 타입프로퍼티가 되면 인스턴스를 생성하더라도 인스턴스에서 프로퍼티를 접근할수가 없고, 타입 그 자체로만 프로퍼티에 접근이 가능하다. (메소드에서도 동일)
특징
이러한 static키워드를 통해서 만든 타입 프로퍼티, 타입메소드는 단 한번 해당 타입이 메모리에 올라갔을때 부터는 계속해서 메모리를 공유하는 방법이다. 따라서 인스턴스와 상관이 전혀 없으며, 인스턴스를 생성하는 시점에서 이니셜라이즈 해줄수 없기 때문에, 항상 초기값을 가져야 한다는 특징을 가진다.
연산 타입 프로퍼티 오버라이드(type method override)
연산 타입프로퍼티 또한 오버라이드가 가능한데 static키워드 그 자체로는 오버라이드가 불가능한 형태이다.
따라서 class키워드를 통해서 오버라이드가 가능한 타입 프로퍼티라는것을 선언할수 있다.
싱글톤에서의 static 키워드
해당 클래스의 인스턴스를 클래스 내부에 shared라는 변수에 만들어두고, private키워드로 이니셜라이저를 접근제어 해두면, 다른 클래스에서 해당 인스턴스를 선언할수 없기 때문에, 다른 스레드나 클래스에서 다른 인스턴스가 생성될 가능성이 없기 때문에 thread-safe하다.
위의 방법처럼 Uno.shared를 통해서 전역적으로 선언된 타입프로퍼티에 접근하게 되면 단 하나의 인스턴스에 접근하게 되는것이다. 이를 통해서 싱글톤 패턴을 만들수 있게 된다.
스위프트에서 싱글톤
let screen = UIScreen.main
let userDefault = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default
이런 키워드를 통해서 싱글톤을 사용하고 있다.
정리
싱글톤이란 데이터 공유와 메모리적 측면의 이점을 위해 전역적으로 사용하는 하나의 인스턴스를 사용하는 디자인 패턴이다.
이러한 싱글톤 디자인 패턴을 이용할때는, 다중스레드를 이용할 경우, 인스턴스가 스레드별로 여러개가 생성되는것을 주의해야한다.
스위프트에서는 이러한 thread-safety에 관한 문제를, static키워드 (타입프로퍼티)를 통해서 전역적으로 생성함과 동시에 lazy키워드 처럼 메모리에 올라가는 시점에 인스턴스를 생성하고 이를 공유하기 때문에 이러한 문제를 해결하였다.
참고자료는 제가 어디서 썻는데 옛날에 썻던거라 기록을 안해뒀네요.
혹시라도 아시게 되거나 아시는분들은 댓글 남겨주시면 추가하도록 하겠습니다!
'앱 > Swift' 카테고리의 다른 글
Swift) Static Dispatch, Dynamic Dispatch이란? (0) | 2023.04.09 |
---|---|
SwiftUI) ObservableObject, ObservedObject, SateObject, Published 에 관하여 (0) | 2023.03.27 |
세마포어(DispatchSemaphore)란 무었인가? (2) | 2023.03.22 |
GCD, Dispatchqueue란? (0) | 2023.03.22 |
weak , strong, unowned, ARC 는 뭐고 왜 쓰는건가요?? (0) | 2023.03.21 |