Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오.
Opened this issue · 6 comments
Singleton 패턴이란 객체의 인스턴스를 1개만 생성하여 공용으로 사용하는 패턴을 의미합니다.
Singleton 패턴을 활용하는 경우는 URLSession, UserDefaults, NotificartionCenter가 있습니다.
Singleton 패턴이란 하나의 객체를 공용으로 사용하고 싶을 때 사용하는 디자인 패턴입니다. 이를 사용하면 메모리 낭비를 방지할 수 있고 다른 클래스들과 자원공유가 쉽다는 장점이 있습니다. 반면, Singleton instance 로 너무 많은 데이터를 공유하게 되면 클래스들간의 결합도가 높아지고 코드수정과 테스트가 어려워진다는 단점이 있습니다.
Singleton 패턴을 만드는 방법은 아래와 같습니다.
- static 으로 선언된 프로퍼티를 생성합니다.
static let shared = Test()
- Init 함수를 private 으로 생성해 Instance 를 또 생성하는 것을 방지합니다.
이렇게 생성된 Singleton class는 싱글톤_클래스_이름.shared
으로 접근할 수 있습니다.
싱글톤패턴은 객체의 인스턴스가 오직 하나만 생성되는 패턴입니다. 메모리 낭비가 없고 데이터 공유가 용이하다는 장점이 있지만, 클라이언트가 클래스에 의존적이기 때문에 테스트가 어렵고 다른 클래스의 인스턴스와의 결합도가 높아져 코드의 유연성이 떨어진다는 단점이 있습니다. UIScreen, UserDefaults, UIApplication, FileManager, NotificationCenter 등에서 사용됩니다.
Singleton 패턴은 앱 전체에 공유되는 리소스 혹은 서비스에 대해 통합 접근 지점을 제공하는 방법으로, swift에서는 URLSession, FileManager, NotificationCenter, UIApplication 등에서 사용됩니다.
URLSession과 FileManager의 경우 세부적인 설정이 필요한 경우 직접 생성하여 사용하게끔 되어 있습니다. NotificationCenter 또한 Notification을 광범위하게 사용하는 경우 알림 센터를 기능적으로 나누어 구성하면 성능이 더 향상됩니다. 다만 UIApplication의 shared 객체는 iOS에서 실행되는 앱에 대한 중앙 집중 제어 및 조정 지점이기 때문에 추가 생성을 하는 경우는 아직 접해본 적이 없습니다.
(뇌피셜)제가 생각하기에는 기본 설정의 객체를 편리하게 사용하고 싶거나, 앱 전체가 하나 상태를 공유할 필요성이 있는 두 경우 사용되는 듯 합니다.
5/23 정정)
FileManager, URLSession과 같이 static 변수에 할당된 객체 외에 추가적으로 생성자를 호출할 수 있는 경우, 싱글톤 패턴이라고 할 수 없다.
Singleton pattern은 특정 용도로 객체를 하나만 생성하여 공용으로 사용하고 싶을 때 사용하는 디자인 유형입니다.
Singleton을 이용했을 때 장점은 3가지 입니다. 먼저 단 하나만 만들기 때문에 메모리 소모가 적습니다. 그다음 생성 시 단 한 번만 초기화하기 때문에 시간이 감소합니다. 그리고 전역에서 접근할 수 있는 객체를 만들 수 있어 데이터 공유에 유리합니다.
하지만 단점도 많습니다. 첫 째, UI 테스트용 객체를 만들기가 어려워질 수 있습니다. 둘 째, 의존성을 쉽게 만들어낼 수 있습니다. 셋 째, 멀티 스레드 환경에서 객체가 여러개가 되는 문제가 발생할 수 있습니다.
Swift에서는 URLSession, FileManager, Notification 등에서 사용합니다.
싱글톤 패턴은 특정 용도로 객체를 하나만 생성하여 공용으로 사용하고 싶을때 사용하는 디자인 패턴입니다. static property와 private init을 사용해 싱글톤 객체를 만들 수 있습니다.
환경설정, 네트워크, 로그인 정보등과 같이 하나만 존재하는 것을 보장하고 싶을 때 싱글톤 객체를 여러 객체에서 접근 가능하도록 사용합니다.
싱글톤 패턴의 장점은 한번의 인스턴스만 생성하므로 메모리 낭비를 방지할 수 있고, 전역 인스턴스기 때문에 다른 클래스들과 자원 공유가 쉽고, DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야 할 때 효율적입니다.
하지만 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스 간 결합도가 높아져 "개방 폐쇄" 원칙을 위배하고 따라서 수정과 테스트가 어려워 진다는 단점이 있습니다.
iOS에서는 UIScreen.main, Userdefaults.standard, UIApplication.shared, FileManager.default, NotificationCenter.default 등과 같은 싱글톤이 존재합니다.
(인스턴스를 1회만 생성하는것을 보장하기 위해 Objective-C에서는 dispatch_once_t를 사용해야 했는데 Swift에서는 static let으로 선언하는 것만으로도 1회 생성을 보장)