post-custom-banner

1. Singleton Pattern?

애플리케이션이 시작될 때 객체의 인스턴스를 최초 1회만 생성(static)하여 사용하는 디자인 패턴

2. Singleton Pattern 생성 방법

class SingletonClass {
	static let shared = SingletonClass()
	private init() {}
}

스위프트에서는 static let으로 객체의 인스턴스를 할당해주면 끝입니다!

그리고 인스턴스가 추가로 생성되는 것을 방지하기위해 init() 함수의 접근 제어자를 private으로 선언합니다.

3. Singleton 사용 예제 

class AppInfo {
	static let shared = AppInfo()
	private init() {}
 
	var mainInfo: [String : Any]? {
		guard let info = Bundle.main.infoDictionary else {
			return nil
		}
		return info
	}
 
	var name: String? {
		self.mainInfo?["CFBundleName"] as? String
	}
 
	var scheme: String? {
		guard let urlTypes = self.mainInfo?["CFBundleURLTypes"] as? [AnyObject],
			let urlTypeDictionary = urlTypes.first as? [String: AnyObject],
			let urlSchemes = urlTypeDictionary["CFBundleURLSchemes"] as? [AnyObject],
			let scheme = urlSchemes.first as? String else { return nil }
		return scheme
	}
 
	var version: String? {
		self.mainInfo?["CFBundleShortVersionString"] as? String
	}
}

앱 정보의 프로퍼티를 저장하고 있는 AppInfo 클래스를 Singleton 작성한 코드입니다.

let appInfo = AppInfo.shared
 
if let appName = appInfo.name,
	let appScheme = appInfo.scheme,
	let appVersion = appInfo.version {
		print("appName: \(appName)")
		print("appScheme: \(appScheme)")
		print("appVersion: \(appVersion)")
}

appInfo 변수에 AppInfo 클래스의 shared(인스턴스)를 가져옵니다.

이제 어떤 화면(클래스)에서든 해당 클래스의 프로퍼티에 접근할 수 있게되었습니다.

4. Singleton 패턴의 장단점

장점

  • 인스턴스를 최초 1회만 생성하므로 메모리와 성능 측면에서 효율이 좋다.
  • 클래스 간 데이터 공유가 쉽다.
  • 인스턴스가 1개라는 것을 보증받는다. (Thread Safe)

단점

  • Singleton 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 개방-폐쇄 원칙(OCP, Open-Closed Principle)을 위배하게 된다.
    • 따라서 수정과 테스트가 어려워진다.
  • Singleton 위한 코드를 구현해야함
    • 일반적으로는 그렇지만 스위프트에서는 매우 간편하게 구현할 수 있다.
profile
RTFM
post-custom-banner

0개의 댓글