Swift개발

[Swift] Singleton Pattern, 싱글톤 패턴

녹차맛고양이 개발강좌 및 IT리뷰 2022. 5. 30. 13:28

1. 기본 내용

Singleton 패턴의 기본적인 정의는

한 개의 클래스로 만들어진 객체는 단 하나여야 한다입니다.

 

그래서 하나의 전역 객체를 만들어서

프로그램 전체에서 사용을 합니다.

 

기본적인 구현방법입니다.

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

 

이렇게 만들어둔 클래스는 프로그램 전체에서 전역으로 사용이 가능합니다.

 

아래와 같은 방법으로 불러와서 사용이 가능합니다.

let userInfo = UserInfo.shared

 

2. 장단점

장점1. 전역 범위에서 데이터 전달이 편합니다.

장점2. 메모리 관리에 이점이 있습니다.

장점3. 큰 차이는 아니지만 init을 한 번 해두면 접근 시간이 줄어듭니다.

 

단점1. 여기저기서 다 사용하기 때문에 사용 위치를 찾기 힘든 의존성 문제가 있습니다.

단점2. 내부의 데이터를 동기적으로 사용하지 않고 동시에 사용하여 잘 못 될 우려가 있습니다.

 

 

3. 예시 코드

아래 와 같은 유저 정보를 가지고 있는 클래스를 만들었습니다.

class UserInfo {
	static let shared = UserInfo()
    
	var infoNum: Int?
	var memberID: String?
	var name: String?
    
	private init(){ }
}

 

이것을 여러 곳에서 불러와 사용을 한다면

 

//A.swift
let userinfoNum = UserInfo.shared
userinfoNum.infoNum = "1234"

//B.swift
let userinfoID = UserInfo.shared
userinfoID.memberID = "Test123"

//C.Swift
let userinfoName = UserInfo.shared
userinfoName.name = "GreenTeaCat"

 

위와 같은 상황이 모두 이루어진 경우에는

프로그램 전체에서 UserInfo의 값으로 동일한

infoNum, memberID, name을 사용 할 수 있습니다.

 

 

 

그리고 하나에만 의존하면 관리에서 힘들어질 경우도 있기에

상황에 맞게 만들어서 사용하는게 편리합니다.

 

class UserInfo {
	static let shared = UserInfo()
    
	var infoNum: Int?
	var memberID: String?
	var name: String?
    
	private init(){ }
}

class SettingInfo {
	static let shared = SettingInfo()
    
	var push: Bool?
	var autoLogin: Bool?
    
	private init(){ }
}

/////////////////////////////////////

// A.swift
let userInfo = UserInfo.shared
let settingInfo = SettingInfo.shared

userInfo.infoNum = "1234"
userInfo.memberID = "TestID123"
userInfo.name = "GreenTeaCat"

settingInfo.push = true
settingInfo.autoLogin = false

// B.Swift
let userInfo = UserInfo.shared
let settingInfo = SettingInfo.shared

print(userInfo.name ?? "")		// GreenTeaCat
print(settingInfo.autoLogin ?? false)	// false