iOS 인터뷰 준비 5 — 싱글톤
May 04 2023
싱글톤 패턴은 클래스가 하나의 인스턴스만 갖도록 하고 해당 인스턴스에 대한 글로벌 액세스 지점을 제공하는 디자인 패턴입니다. 이는 앱의 여러 부분에서 클래스를 공유해야 할 때 유용할 수 있지만 클래스의 여러 인스턴스를 만드는 것은 실용적이거나 바람직하지 않습니다.
싱글톤 패턴은 클래스가 하나의 인스턴스만 갖도록 하고 해당 인스턴스에 대한 글로벌 액세스 지점을 제공하는 디자인 패턴입니다. 이는 앱의 여러 부분에서 클래스를 공유해야 할 때 유용할 수 있지만 클래스의 여러 인스턴스를 만드는 것은 실용적이거나 바람직하지 않습니다. iOS에서 싱글톤 패턴은 일반적으로 사용되는 디자인 패턴입니다.
인터뷰 질문들
- Singleton은 무엇이며 iOS 개발에서 어떻게 사용됩니까?
- Singleton 디자인 패턴과 그 장점을 설명할 수 있습니까?
- 다중 스레드 환경에서 Singleton의 다중 인스턴스를 방지하는 가능한 방법은 무엇입니까?
- iOS 앱에서 언제 Singleton을 사용하는지에 대한 예를 들어주실 수 있나요?
- iOS에서 Singleton을 어떻게 테스트합니까?
싱글톤에 대한 일반적인 우려 사항 중 하나는 종종 스레드로부터 안전하지 않다는 것입니다. 싱글톤 인스턴스에 동시에 액세스하는 여러 컨트롤러에서 자주 사용됩니다.
싱글톤을 만들 때 두 가지를 고려해야 합니다.
- 스레드 안전 방식으로 인스턴스를 만들어야 합니다.
- 추가 인스턴스 생성을 방지하려면 클래스의 초기화 메서드를 비공개로 표시해야 합니다.
- 싱글톤 인스턴스를 초기화하는 동안.
- 인스턴스에 대한 읽기 및 쓰기 중.
Swift에서 싱글톤 패턴을 구현하기 위해 싱글톤이어야 하는 클래스는 static
클래스가 인스턴스가 하나만 있음을 나타내는 키워드로 정의됩니다. 정적 변수는 클래스의 인스턴스를 저장하는 데 사용되고 정적 메서드는 인스턴스에 액세스하는 데 사용됩니다. 다음은 Swift의 싱글톤 클래스의 예입니다.
class Singleton {
// Swift guarantees initialization is atomic
// Swift treats the code performing initialization as a critical section
static let shared = Singleton()
// prevents the creation of additional instances of the class.
private init() {}
}
let singleton = Singleton.shared
@implementation MySingleton
// Lazy initializer
+ (instancetype)sharedInstance {
static dispatch_once_t once;
static id sharedInstance;
// The token ensures that init is executed only once in thread safety manner
dispatch_once(&once, ^{
_sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
// Prevent creating new instance of the singleton
- (instancetype)init __attribute__((unavailable("Use +[MyClass sharedInstance] instead")));
+ (instancetype)new __attribute__((unavailable("Use +[MyClass sharedInstance] instead")));
@end
장점
- 메모리를 절약하고 성능을 향상시키는 데 도움이 될 수 있는 클래스의 단일 인스턴스만 생성되도록 합니다.
- 코드에서 더 쉽게 사용할 수 있도록 클래스 인스턴스에 대한 전역 액세스 지점을 제공합니다.
- 코드의 다른 부분 간에 공유해야 하는 데이터베이스 또는 네트워크 연결과 같은 공유 리소스를 구현하는 데 유용할 수 있습니다.
- 코드의 다른 부분 간에 공유되는 전역 상태를 도입하므로 코드를 테스트 및 디버그하기 어렵게 만들 수 있습니다.
- 테스트 또는 기타 목적으로 클래스의 여러 인스턴스를 생성하기 어렵게 만듭니다.
- 긴밀한 결합으로 이어지고 객체 지향 디자인의 원칙을 위반할 수 있습니다.
- 사용자가 로그아웃할 때 새 싱글톤을 삭제하고 생성해야 할 수 있으므로 사용자 세션 관련 작업에는 적합하지 않은 옵션입니다.
앱당 1개를 보장하는 대신 계정당 1개를 보장합니다. 액세스는 전역이 아닙니다(사용자 세션이 필요함). 싱글톤과 유사하게 처음 액세스할 때 느리게 생성되며 이후에는 항상 동일한 인스턴스가 반환됩니다. 예를 들어 MyUserSession은 인증된 사용자가 세션을 시작할 때 생성됩니다. 사용자 데이터를 포함하는 모든 코드에 주입해야 합니다.