λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🍎 iOS/Design Pattern

[Design Pattern] 싱글톀 νŒ¨ν„΄(Singleton Pattern)

졜근 ν”„λ‘œμ νŠΈμ—μ„œ 싱글톀 νŒ¨ν„΄μ„ μ‚¬μš©ν•΄λ³΄κ²Œ λ˜μ—ˆλŠ”λ°μš”!

싱글톀 νŒ¨ν„΄μ„ μ œλŒ€λ‘œ μ•Œκ³  μ“°κ³ μž 싱글톀 νŒ¨ν„΄μ— λŒ€ν•΄ 정리해보렀고 ν•©λ‹ˆλ‹€.

Singleton의 μ •μ˜, μ‚¬μš©μ΄μœ , μ‚¬μš©λ°©λ²• μˆœμœΌλ‘œ μ •λ¦¬ν•΄λ‚˜κ°€λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€!

싱글톀 νŒ¨ν„΄(Singleton Pattern)μ΄λž€?

μ†Œν”„νŠΈμ›¨μ–΄ λ””μžμΈ νŒ¨ν„΄μ—μ„œ μ‹±κΈ€ν„΄ νŒ¨ν„΄(Singleton pattern)을 λ”°λ₯΄λŠ” ν΄λž˜μŠ€λŠ”, μƒμ„±μžκ°€ μ—¬λŸ¬ μ°¨λ‘€ ν˜ΈμΆœλ˜λ”λΌλ„ μ‹€μ œλ‘œ μƒμ„±λ˜λŠ” κ°μ²΄λŠ” ν•˜λ‚˜μ΄κ³  졜초 생성 이후에 호좜된 μƒμ„±μžλŠ” 졜초의 μƒμ„±μžκ°€ μƒμ„±ν•œ 객체λ₯Ό λ¦¬ν„΄ν•œλ‹€. 이와 같은 λ””μžμΈ μœ ν˜•μ„ μ‹±κΈ€ν„΄ νŒ¨ν„΄μ΄λΌκ³  ν•œλ‹€. [좜처] μœ„ν‚€λ°±κ³Ό

 

싱글톀은 λ””μžμΈ νŒ¨ν„΄ 쀑 μƒμ„± νŒ¨ν„΄μ— ν•΄λ‹Ήν•˜λŠ” λ””μžμΈ μœ ν˜•μœΌλ‘œ, 

ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ μ°¨λ‘€ ν˜ΈμΆœλ˜λ”λΌλ„ λ”± ν•œ 객체만 μƒμ„±λ˜κΈ° λ•Œλ¬Έμ—

객체λ₯Ό ν•˜λ‚˜λ§Œ μƒμ„±ν•˜μ—¬ μ—¬λŸ¬ κ³³μ—μ„œ κ³΅μš©μœΌλ‘œ μ‚¬μš©ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€.

싱글톀. μ™œ μ“°λŠ”κ±΄λ°?

싱글톀 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ­˜κΉŒμš”?

예제둜 보도둝 ν•©μ‹œλ‹€!

 

μ•„λž˜μ™€ 같은 μœ μ €μ˜ 정보λ₯Ό μ €μž₯ν•˜λŠ” ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  ν•΄λ΄…μ‹œλ‹€.

 

class UserInfo {
    var id: String?
    var pw: String?
    var name: String
}

 

λ§Œμ•½, A ViewControllerμ—μ„œ name, B ViewControllerμ—μ„œ id, C ViewControllerμ—μ„œ pw 정보λ₯Ό 받아와

이 클래슀(UserInfo)에 μ €μž₯ν•΄μ•Όλœλ‹€λ©΄

 

// A ViewController
let userInfo = UserInfo()
userInfo.name = "Jane"
// B ViewController
let userInfo = UserInfo()
userInfo.id = "janechoi123"
// C ViewController
let userInfo = UserInfo()
userInfo.pw = "123456"

 

μœ„μ™€ 같이 μ„Έ 개의 Viewcontrollerμ—μ„œ UserInfo 객체λ₯Ό 각각 λ”°λ‘œ μƒμ„±ν•˜μ—¬ id, pw, name 정보λ₯Ό μ €μž₯ν•˜κ²Œλ©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 되면, κ·Έλ¦Όκ³Ό 같이 각각의 μΈμŠ€ν„΄μŠ€(instance)에 정보가 λ”°λ‘œ μ €μž₯이 되겠죠?

 

κ·Έλ ‡μ§€λ§Œ, μš°λ¦¬λŠ” ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€μ— λͺ¨λ“  정보(id, pw, name)κ°€ μ €μž₯λ˜λŠ” 것을 μ›ν•©λ‹ˆλ‹€.

이럴 λ•Œ! 싱글톀 νŒ¨ν„΄μ„ μ‚¬μš©ν•΄μ„œ 이 ν΄λž˜μŠ€μ— λŒ€ν•œ μΈμŠ€ν„΄μŠ€λŠ” 졜초 생성 μ‹œμ— μ „μ—­μœΌλ‘œ μ €μž₯해두고, 

κ·Έ 이후에 이 μ „μ—­ μΈμŠ€ν„΄μŠ€(ν•˜λ‚˜λ§Œ 쑴재)에 μ ‘κ·Όν•˜λ„λ‘ ν•˜λŠ” 방법을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μœ„μ˜ κ·Έλ¦Όκ³Ό 같이 ν•œ μΈμŠ€ν„΄μŠ€μ— μ—¬λŸ¬ κ³³μ—μ„œ 접근이 κ°€λŠ₯ν•˜λ„λ‘ ν•˜λŠ” 것이 λ°”λ‘œ μ‹±κΈ€ν†€μž…λ‹ˆλ‹€!

 

μ—¬κΈ°μ„œ μ „μ—­λ³€μˆ˜μ™€ 같은 역할을 ν•˜λŠ”λ° μ™œ ꡳ이 싱글톀을 μ¨μ•Όν•˜λ‚˜? λΌλŠ” 의문이 λ“€ μˆ˜κ°€ μžˆμ„ν…λ°μš”, 

싱글톀은 λ©”λͺ¨λ¦¬λ©΄μ—μ„œ μž₯점이 ν½λ‹ˆλ‹€.

λ§Œμ•½μ— λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μž‘μ•„λ¨ΉλŠ” ν΄λž˜μŠ€κ°€ μžˆμ„ λ•Œ, μ „μ—­ λ³€μˆ˜λ‘œ μ„ μ–Έν•˜κ²Œ 되면 이λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•Œλ„ λ©”λͺ¨λ¦¬λ₯Ό μž‘μ•„λ¨Ήκ²Œ λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, 싱글톀은 생성 μ‹œμ λΆ€ν„° λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜κ³ , μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•Œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•  수 있기 λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό 방지할 수 μžˆλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, 이것이 단점이 될 μˆ˜λ„ 있겠죠??

μ–΄λŠ κ³³μ—μ„œλ‚˜ 접근이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μ•±μ˜ 규λͺ¨κ°€ 컀진닀면 λ©”λͺ¨λ¦¬ 관리가 μ–΄λ €μ›Œμ§ˆ 수 있기 λ•Œλ¬Έμ— 해지가 μ–΄λ €μ›Œμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— 객체 κ°„ μ˜μ‘΄μ„±μ΄ 컀질 ν™•λ₯ μ΄ λ†’μŠ΅λ‹ˆλ‹€.

λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ•± μ „μ—­μ—μ„œ μ ‘κ·Όν•  수 μžˆλ‹€λ©΄ 각기 λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ 객체의 μƒνƒœλ₯Ό λ³€κ²½μ‹œν‚¬ 수 μžˆμ–΄ λ™μ‹œμ„±μ˜ λ¬Έμ œκ°€ 생길 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. (저도 μ•Œκ³ μ‹Άμ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.. μ΄λŸ¬ν•œ 단점 λ•Œλ¬Έμ— μ•ˆν‹°νŒ¨ν„΄μ΄λΌκ³  λΆˆλ¦¬κΈ°λ„ ν•©λ‹ˆλ‹€)

κ·Έλž˜μ„œ μ–΄λ–»κ²Œ μ“°λŠ”κ±΄λ°?

이제 싱글톀 νŒ¨ν„΄μ„ μ‚¬μš©ν•΄λ΄…μ‹œλ‹€!

 

1. static ν”„λ‘œνΌν‹°λ‘œ Instance 생성

 

class UserInfo {
    static let shared = UserInfo()

    var id: String?
    var pw: String?
    var name: String?
}

 

λ¨Όμ €, μ „μ—­μœΌλ‘œ μ €μž₯될 것이기 λ•Œλ¬Έμ—

static ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ 클래슀 μ•ˆμ— μΈμŠ€ν„΄μŠ€(instance)λ₯Ό μ €μž₯ν•  ν”„λ‘œνΌν‹°λ₯Ό ν•˜λ‚˜ μƒμ„±ν•΄μ€λ‹ˆλ‹€.

(싱글톀 νŒ¨ν„΄μ€ μ°Έμ‘° νƒ€μž…μ—λ§Œ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— classλ₯Ό μ΄μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.) 

 

2. init() private으둜 μ ‘κ·Όμ œμ–΄

 

class UserInfo {
    static let shared = UserInfo()

    var id: String?
    var pw: String?
    var name: String?

    private init() { }
}

 

μƒμ„±μžμΈ init()을 private으둜 μ ‘κ·Όμ œμ–΄ ν•΄μ€λ‹ˆλ‹€.

μ™ΈλΆ€μ˜ 접근을 μ°¨λ‹¨μ‹œμΌœμ„œ UserInfo클래슀의 shared μΈμŠ€ν„΄μŠ€λ‘œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ„λ‘ μ œν•œν•˜λŠ” 것이 싱글톀 νŒ¨ν„΄μž…λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ κ°„λ‹¨ν•˜κ²Œ 싱글톀 객체λ₯Ό λ§Œλ“€μ–΄μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€!

κ·Έλ ‡λ‹€λ©΄ μ™ΈλΆ€μ—μ„œλŠ” μ–΄λ–»κ²Œ μ ‘κ·Όν• κΉŒμš”?

 

3. Singleton Class μ ‘κ·Ό 방법

μƒμ„±ν•΄μ£Όμ—ˆλ˜ static ν”„λ‘œνΌν‹°λ₯Ό μ΄μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

μ–΄λŠ ν΄λž˜μŠ€μ—μ„œλ“  sharedλΌλŠ” static ν”„λ‘œνΌν‹°λ‘œ μ ‘κ·Όν•˜λ©΄, ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό κ³΅μœ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ—, μ•„λž˜μ™€ 같이 λ‹€λ₯Έ ViewControllerμ—μ„œ λ™μΌν•œ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•΄ 값을 정해쀄 μˆ˜λ„ 있고,

 

// A ViewController
let userInfo = UserInfo.shared
userInfo.name = "Jane"
// B ViewController
let userInfo = UserInfo.shared
userInfo.id = "janechoi123"
// C ViewController
let userInfo = UserInfo.shared
userInfo.pw = "123456"

 

μ΄λ ‡κ²Œ μ €μž₯된 값을 가져와 μ‚¬μš©ν•΄μ€„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

 

// D ViewController
let userInfo = UserInfo.shared
print(userInfo.name ?? "")

 


참고자료

https://ko.wikipedia.org/wiki/μ‹±κΈ€ν„΄_νŒ¨ν„΄

http://blog.whatifill.com/blog/design-patterns-with-swift

https://babbab2.tistory.com/66

https://ggasoon2.tistory.com/5

 

'🍎 iOS > Design Pattern' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Design Pattern] κ΅¬μ‘°νŒ¨ν„΄ - Adapter Pattern  (0) 2022.05.20