๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŽ 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' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€