๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

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

The singleton pattern ensures a class has only one instance and provides a global point of access to it.

์˜ค๋Š˜์€ ํ•ญ์ƒ ๋…ผ๋ž€์˜ ์ค‘์‹ฌ์— ์žˆ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค..! ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด์ง„ ์ดํ›„์—๋Š” ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ ˆ๋Œ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š๋„๋กํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์˜์—ญ์—์„œ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ์›๋ฆฌ

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ํ•ต์‹ฌ์€ ๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ฒ˜์Œ์— ์ƒ์„ฑํ•˜๊ณ , ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ฒƒ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋จผ์ € ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ฒŒ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์ƒ์„ฑ์ž๋ฅผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ˆจ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑด private ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ .

import Foundation

class Singleton {
    private init() {}
}

์ด๋ ‡๊ฒŒ private์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ์ˆจ๊ธฐ๋ฉด, ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์™ธ๋ถ€์—์„œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋Š” ์ ˆ๋Œ€ ์ƒˆ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•˜๋Š”๋ฐ์š”, ์ด๋ฅผ ์œ„ํ•ด์„œ ๋‚ด๋ถ€ ์ƒ์„ฑ์ž์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํƒ€์ž… ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” lazyํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์ฒ˜์Œ shared ๋ณ€์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด์„œ shared์— ์ €์žฅ๋˜์ฃ . ๊ทธ๋ฆฌ๊ณ  shared๋Š” let ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ €์žฅ๋œ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— shared๋ฅผ ํ†ตํ•ด ํ•ญ์ƒ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

class Singleton {
    static let shared = Singleton()
    var state = true
    
    private init() {}
}

class A {
    let singleton = Singleton.shared
    
    func printState() {
        print(singleton.state)
    }
    
    func updateState() {
        singleton.state.toggle()
    }
}

class B {
    let singleton = Singleton.shared
    
    func printState() {
        print(singleton.state)
    }
    
    func updateState() {
        singleton.state.toggle()
    }
}

let a = A()
let b = B()

a.printState() // true
b.printState() // true
a.updateState()
a.printState() // false
b.printState() // false

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—์„œ ๊ณต์œ ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์‹ฑ๊ธ€ํ†ค์€ ์•ˆํ‹ฐ ํŒจํ„ด?

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์ž์ฃผ ์•ˆํ‹ฐ ํŒจํ„ด์œผ๋กœ ๋ถˆ๋ฆฌ๋Š”๋ฐ์š”, ๋…ผ๋ž€์˜ ํ•ต์‹ฌ์€ ๋‹จ์ง€ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ „์—ญ์—์„œ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•ด ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์— ์žˆ๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์ธ์Šคํ„ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฐ ํŠน์ง•์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ˆœ๊ฐ„์— ์ธ์Šคํ„ด์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‹จ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๊ฒŒ ์•„๋‹ˆ์—์š”. ๋งŒ์•ฝ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ตฌ๋ถ„๋˜์–ด์„œ ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋ง์ด ๋˜์ง€ ์•Š๊ฒ ์ฃ . ๊ทธ๋ ‡๋‹ค๋ฉด ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ž‘์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿผ ์ด ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  ์˜์—ญ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ดํ›„์— ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค๋ฉด ์ตœ์•…์˜ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

๋”ฐ๋ผ์„œ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ํ™•์‹คํ•˜๋‹ค๋ฉด ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์„ ํƒํ•ด๋„ ๋˜๊ฒ ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ 100% ํ™•์‹ ์„ ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋„๋ก ํ•˜๋‹ˆ๊นŒ์š”.

 

๋งˆ๋ฌด๋ฆฌ

์•„๋งˆ ๋””์ž์ธ ํŒจํ„ด ํฌ์ŠคํŠธ ์ค‘ ๊ฐ€์žฅ ์งง์€ ํฌ์ŠคํŠธ๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ๋„ค์š”ใ…Žใ…Ž

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๊ต‰์žฅํžˆ ํŽธํ•˜๋‹ค๋Š” ์ƒ๊ฐ์„ ๋งŽ์ด ํ•˜๊ณค ํ•ด์š”. ์ƒํƒœ๋„ ์–ด๋””์„œ๋“  ๊ณต์œ ๊ฐ€ ๋˜๊ณ , ์ธ์Šคํ„ด์Šค๋ฅผ ์ด๋ฆฌ์ €๋ฆฌ ์ „๋‹ฌํ•  ํ•„์š”๋„ ์—†๊ตฌ์š”. ํ•˜์ง€๋งŒ ์ดํ›„์— ํ”„๋กœ๊ทธ๋žจ์ด ์–ธ์ œ๋“ ์ง€ ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์กฐ๊ธˆ์€ ๋ณต์žกํ•˜๊ณ  ๋ฒˆ๊ฑฐ๋กญ๋”๋ผ๋„ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์Šค์ฝ”ํ”„ ๋‹จ์œ„๋กœ ์ œํ•œํ•˜๊ณ  ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒŒ ๋” ์ข‹๊ฒ ์ฃ . ๋ฌด์กฐ๊ฑด ์‹ฑ๊ธ€ํ†ค์„ ๋ฐฐ์ฒ™ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€ ์•„๋‹ˆ์ง€๋งŒ ์‚ฌ์šฉ์— ์žˆ์–ด์„œ ์ถฉ๋ถ„ํžˆ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

์˜ค๋Š˜๋„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!