Skip to content

Latest commit

ย 

History

History
157 lines (108 loc) ยท 7.21 KB

File metadata and controls

157 lines (108 loc) ยท 7.21 KB

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด (Singleton Pattern)

1. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(Singleton Pattern)์ด๋ž€?

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ, ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์ตœ์ดˆ ํ•œ ๋ฒˆ๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น(static)ํ•˜๊ณ  ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด

์ฆ‰, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ 'ํ•˜๋‚˜'์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

์ƒ์„ฑ์ž๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋˜๋„, ์‹ค์ œ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์ด๋ฉฐ ์ตœ์ดˆ๋กœ ์ƒ์„ฑ๋œ ์ดํ›„์— ํ˜ธ์ถœ๋œ ์ƒ์„ฑ์ž๋Š” ์ด๋ฏธ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜์‹œํ‚ค๋„๋ก ๋งŒ๋“ ๋‹ค.

๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ๋˜‘๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๊ธฐ์กด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ™œ์šฉํ•จ!

2. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์•„๋ž˜์™€ ๊ฐ™์ด ์œ ์ €์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค.

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 = "Subin"

// B ViewController
let userInfo = UserInfo()
userInfo.id = "subin123"

// C ViewController
let userInfo = UserInfo()
userInfo.pw = "123456"

์„ธ ๊ฐœ์˜ Viewcontroller์—์„œ UserInfo ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐ ๋”ฐ๋กœ ์ƒ์„ฑํ•˜์—ฌ id, pw, name ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ฒŒ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค์— ์ •๋ณด๊ฐ€ ๋”ฐ๋กœ ์ €์žฅ๋˜๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค์— ๋ชจ๋“  ์ •๋ณด(id, pw, name)์ด ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ์›ํ•œ๋‹ค๊ณ  ํ•˜์ž.

์ด๋Ÿด ๋•Œ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šค๋Š” ์ตœ์ดˆ ์ƒ์„ฑ์‹œ์— ์ „์—ญ์œผ๋กœ ์ €์žฅํ•ด๋‘๊ณ , ์ดํ›„์— ์ด ์ „์—ญ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค์ด๋‹ค.

์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์‹œ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

3. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ์ ์šฉํ•˜๋Š” ๋ฒ•

3-1. static ํ”„๋กœํผํ‹ฐ๋กœ Instance ์ƒ์„ฑ

๋จผ์ € ์ „์—ญ์œผ๋กœ ์ €์žฅ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— static ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ํด๋ž˜์Šค ์•ˆ์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ €์žฅํ•  ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค.

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์ฐธ์กฐ ํƒ€์ž…๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— class๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

class UserInfo {
    static let shared = UserInfo()

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

3-2. init() private์œผ๋กœ ์ ‘๊ทผ์ œ์–ด

์ƒ์„ฑ์ž์ธ init()์„ private๋กœ ์ ‘๊ทผ์ œ์–ด๋ฅผ ํ•ด์ค€๋‹ค.

์™ธ๋ถ€์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จ์‹œ์ผœ UserInfo ํด๋ž˜์Šค์˜ shared ์ธ์Šคํ„ด์Šค๋กœ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋‹ค.

class UserInfo {
    static let shared = UserInfo()

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

    private init() { }
}

3-3. Singleton Class ์ ‘๊ทผ ๋ฐฉ๋ฒ•

์œ„์—์„œ ๋งŒ๋“  ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์„ฑํ•ด์ค€ static ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.

์–ด๋А ํด๋ž˜์Šค์—์„œ๋“  shared๋ผ๋Š” static ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผํ•˜๋ฉด, ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ViewController์—์„œ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•ด ๊ฐ’์„ ์ •ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

// A ViewController
let userInfo = UserInfo.shared
userInfo.name = "Subin"

// B ViewController
let userInfo = UserInfo.shared
userInfo.id = "subin123"

// C ViewController
let userInfo = UserInfo.shared
userInfo.pw = "123456"

์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ €์žฅ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

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

4. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๋ฌธ์ œ์ 

์‹ฑ๊ธ€ํ†คย ํŒจํ„ด์€ย ์ „์—ญย ์ƒํƒœ(Globalย State)๋กœย ์ด์šฉํ• ย ์ˆ˜ย ์žˆ๋‹ค๋Š”ย ์žฅ์ ์ดย ์žˆ์ง€๋งŒย ๋‹ค์Œ๊ณผย ๊ฐ™์€ย ๋ฌธ์ œ์ ์„ย ๊ฐ€์ง€๊ณ ย ์žˆ์–ดย ์•ˆํ‹ฐย ํŒจํ„ด์œผ๋กœ๋„ย ๋งŽ์ดย ๋ถˆ๋ฆฐ๋‹ค.

  • private ์ƒ์„ฑ์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
  • ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹ฑ๊ธ€ํ†ค์ด 1๊ฐœ๋งŒ ์ƒ์„ฑ๋จ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ์ „์—ญ ์ƒํƒœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•˜๋‹ค.
  1. private ์ƒ์„ฑ์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์‹ฑ๊ธ€ํ†ค์€ ์ž์‹ ๋งŒ์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ์ œํ•œํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ์†์„ ํ†ตํ•ด ๋‹คํ˜•์„ฑ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์žฅ์ ์„ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์ ์ด์ง€ ๋ชปํ•œ static ํ•„๋“œ์™€ static ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ย  ย 
  2. ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“ค๋‹ค. ์‹ฑ๊ธ€ํ†ค์€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ํž˜๋“œ๋ฉฐ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค์€ ์ƒ์„ฑ ๋ฐฉ์‹์ด ์ œํ•œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— Mock ๊ฐ์ฒด๋กœ ๋Œ€์ฒดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šฐ๋ฉฐ, ๋™์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ๋„ ํž˜๋“ค๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ์ธ๋ฐ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ํฐ ๋‹จ์ ์ด ๋œ๋‹ค. ย  ย 
  3. ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹ฑ๊ธ€ํ†ค์ด 1๊ฐœ๋งŒ ์ƒ์„ฑ๋จ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์„œ๋ฒ„์—์„œ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  1๊ฐœ ์ด์ƒ์˜ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Java ์–ธ์–ด๋ฅผ ์ด์šฉํ•œ ์‹ฑ๊ธ€ํ†ค ๊ธฐ๋ฒ•์€ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์‹ฑ๊ธ€ํ†ค์ด ๊ผญ ๋ณด์žฅ๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ JVM์— ๋ถ„์‚ฐ๋ผ์„œ ์„ค์น˜๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ย  ย 
  4. ์ „์—ญ ์ƒํƒœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•˜๋‹ค. ์‹ฑ๊ธ€ํ†ค์˜ ์Šคํƒœํ‹ฑ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์–ธ์ œ๋“ ์ง€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ „์—ญ ์ƒํƒœ(Global State)๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ์‰ฝ๋‹ค. ์•„๋ฌด ๊ฐ์ฒด๋‚˜ ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ฉฐ ๊ณต์œ ๋˜๋Š” ์ „์—ญ ์ƒํƒœ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ย  ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๊ฐ์ฒด๋ฅผ 1๋ฒˆ ์ƒ์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ๋ถ„๋ช…ํžˆ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค๋ฅธ ๋‹จ์ ๋“ค์ด ๋„ˆ๋ฌด ํฌ๊ฒŒ ๋ถ€๊ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ™œ์šฉ์ด ์‰ฝ์ง€ ์•Š๋‹ค.ย ๋งŒ์•ฝ ํ”„๋ ˆ์ž„์›Œํฌ์—๊ฒŒ ์‹ฑ๊ธ€ํ†ค์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์€ ๋‹จ์ ๋“ค์„ ๋งŽ์ด ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

[Swift] ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(Singleton Pattern)

[๋””์ž์ธ ํŒจํ„ด] ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(Singleton pattern)

Singleton Pattern

[๋””์ž์ธ ํŒจํ„ด] ์‹ฑ๊ธ€ํ†ค์ด ์•ˆํ‹ฐ ํŒจํ„ด์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์™€ ์ž๋ฐ” ์‹ฑ๊ธ€ํ†ค๊ณผ ์Šคํ”„๋ง ์‹ฑ๊ธ€ํ†ค์˜ ์ฐจ์ด

[Swift] Singleton Pattern(์‹ฑ๊ธ€ํ„ด ํŒจํ„ด)์ด๋ž€?

Swift: Singleton, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด