싱글톤 패턴은 소프트웨어 디자인 패턴의 하나로, 클래스의 인스턴스가 하나만 만들어지도록 설계하는 패턴이다. 즉, 한 클래스에 대해 단 한 번의 객체 생성만 허용하며, 이후에는 이미 생성한 동일한 객체를 반복적으로 재사용한다.이렇게 함으로써 시스템에 해당 클래스의 객체가 단 하나만 존재하게 된다.
싱글톤 패턴은 iOS에서 많은 곳에 활용되며, 각각 객체가 시스템 내에서 한 개만 존재하도록 보장하여 리소스를 효율적으로 관리하고, 다양한 컴포넌트 간의 통신을 요이하게 한다.
싱글톤 객체는 주로 shared, standard, default 등의 이름으로 접근하는 것을 볼 수 있다.
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let defaults = UserDefaults.standard
let notificationCenter = NotificationCenter.default
let session = URLSession.shared
이렇게 싱글톤 패턴은 iOS에서 많은 곳에서 활용되며, 각각의 객체가 시스템 내에서 한 개만 존재하도록 보장함으로써 리소스를 효율적으로 관리하고, 다양한 컴포넌트 간의 통신을 용이하게 한다. 그리고 싱글톤 객체는 주로 shared, standard, default 로 표현하여 접근하는 것을 볼 수 있다.
class Singleton {
static let shared = Singleton() // 1.
private init() { // 2.
// 단 한 개의 인스턴스만 생성되도록 보장하기 위해 초기화를 비공개로 설정
}
}
이 클래스는 shared라는 정적 속성을 통해 자신의 단일 인스턴스 객체를 참조한다.
생성자를 private로 선언하여 클래스 외부에서 초기화 하는것을 방지하여 여러 인스턴스가 생성되는것을 방지한다.
결과적으로 이 클래스의 인스턴스는 프로그램 내에서 단 하나만 존재하게 된다.
static?
알반 인스턴스 프로퍼티는 해당 타입의 인스턴스가 생성될 때마다 인스턴에 대한 별도의 메모리 공간에 할당된다. 반면 static 키워드를 통해 선언하면 해당 타입의 인스턴스와는 독립적으로 존재하며, 프로그램이 시작된 후 해당 타입을 처음으로 사용될 때(런타임 시점) 메모리에 올라간다.
장단점을 보면 확실한 장점이 있지만 단점이 상당히 많이 보인다.
그래서 많은 개발자들은 싱글톤 패턴의 부작용에 대해 많이 언급하곤 하는데 그렇기 때문에 싱글톤 패턴은 꼭 필요한 상황에만 제한적으로 사용해야 한다.
Swift환경에서의 싱글톤 동시성 문제
Swift3.0 이후부터 싱글톤 패턴을 구현할 때 'static let' 을 사용했는데 'static let' 은 처음으로 접근될 때까지 초기화 되지 않으며, 'thread safe' 하게 수행되도록 설계되어 있다. 즉 초기화가 한번만 이루어지며 이 과정에서 발생할 수 있는 동시성 문제의 경쟁 상황을 제거하여 동시성 문제가 발생하지 않도록 한다.
싱글톤 패턴은 특정한 상황에 매우 유용하지만, 사용에 있어서는 주의가 필요하다. 결국 싱글톤 패턴의 사용은 꼭 필요한 알맞은 상황에서만 사용하도록 하자