Open Do-hyun-Kim opened 1 year ago
URLSession.shared
, UserDefaults.standard
, FileManager.default
등이 싱글톤 패턴 기반으로 만들어져 있다.static let
을 사용하고, 클래스 내부에 pirvate init 을 해서 외부에서 생성할 수 없도록 한다.
class Singleton {
static let shared = Singleton()
private init() {}
}
타 언어에서 일반적으로 Singleton 객체는 멀티 스레드 환경에 의해 여러 Singleton 객체가 생성될 수 있어 thread-safe 하지 않지만, Swift 에서는 dispatch_once
가 자동 적용되기 때문에 단 하나의 싱글톤 객체만이 생성되어 thread-safe 하다.
Swift 에서 Singleton 객체는 static
키워드로 선언될 경우 lazy
속성을 그대로 물려받게 됨으로 사용할 때 최초로 객체가 생성이 된다. 이는 멀티 스레드 환경에서 동시에 접근되더라도 하나의 객체가 생성됨을 보장한다.
*dispatch_once
: App 라이프 사이클에서 단 한번만 실행되도록 보장해 주는 것을 의미하며 Thread Safe을 보장 받기 위해 사용한다.
private init
을 통해 객체 생성을 막음으로서 Mock 객체를 만들 수 없어 테스트하기에 용이하지 않다내가 어떤 객체를 만들어서 그 객체 하나만을 사용하는 패턴을 의미. 만약 자주 써야하는 객체일 경우, 객체를 만들어서 메모리에 올려놓을 것이다. 그럼 그 메모리에 올려놓은 객체를 지속적으로 데리고 다니면서 사용하고, 계속 참조해서 이용하는 패턴이다.
하나의 메모리에 있는 객체를 지속적으로 사용함으로써 메모리 누수를 방지할 수 있다. 또한 싱글톤으로 구현한 인스턴스는 '전역'이므로, 다른 클래스의 인스턴스들이 데이터를 공유할 수 있다는 것이 장점이다.
싱글톤 인스턴스가 혼자 너무 많은 일을 하거나, 많은 양의 데이터를 공유시키면 다른 클래스들의 결합도가 높아진다. 이렇게 되게 되면 객체 지향 설계 원칙 중에 '개방 폐쇄 원칙 (Open Closed Principle, OCP)'를 위반하게 된다.
OCP란 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계해야한다는 원칙이다. 고로, 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적이어야 한다. 코드 사이의 결합도가 높아지게 되면, 유지보수가 힘들어지고, 테스트도 원활하게 진행해주기 쉽지 않음
또한 멀티 스레드 환경에서 동기화 처리를 해주지 않았을 때, 인스턴스가 두개 이상 생성되는 문제도 발생할 수 있다. 따라서 싱글톤 패턴은 반드시 사용해야하는 상황이 아니면, 지양하는것이 좋다고 함
static let shared = SinglethonSample()
let 으로 선언한 것은 기본적으로 thread-safe 하므로 별도로 dispatch_once_t 가 불필요하고, static 전역변수로 선언한 것은 lazy하게 동작하므로 처음 Singleton을 생성하기 전까지 메모리에 올라가지 않음
final class SinglethonSample {
//* static 프로퍼티로 Instance 생성하기
static let shared = SinglethonSample()
//* init 함수 접근제어자를 private로 지정하기
private init() {
}
}
// Singleton Class 접근
let instance: SinglethonSample = SinglethonSample.shared
특정 용도로 객체를 하나만 생성하여 공용으로 사용하고 싶을 때 사용하는 디자인 유형 한 Instance로 어디 클래스에서든 접근 가능하게 하는 것
let screen = UIScreen.main
let userDefault = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default
Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오.
🧐 Singleton Pattern 이란?
Thread Pool
,Cache
,대화 상자
,사용자 설정
,레지스트리 설정
,로그 기록
등에 객체가 여러 개 있는 것보다 하나만 있어야 하는 경우에 Singleton Pattern을 유용하게 사용한다.🥰 Singleton Pattern 장점
Global Instance
로 다른 모듈과 자원 공유가 쉽다는 장점이 있다.Instance
만 생성 하기 때문에 메모리 낭비를 방지 할 수 있다.🤔 Singleton Pattern 단점
Open Closed Principle
에 어긋나는 패턴이 된다.static let
으로 인스턴스 생성시dispatch_once_t
이 자동 적용 되기 때문에Thread Safe
하기 때문이다.initialize
가private
으로 되어 있기 때문에 Mock객체를 주입할수 없으므로 테스트 하기 어렵다.✍️ Singleton Pattern 단점 개선
📝 참고 사이트
Migrating to Swift 3
Apple Developer Documentation
thread-safety 한 싱글톤 사용은?
싱글톤 패턴(Singleton Pattern](https://babbab2.tistory.com/66)