Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Computer/Design Pattern

[๋””์ž์ธํŒจํ„ด] (Swift) Singleton Pattern (์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ)

๊ฐ์ž ๐Ÿฅ” 2023. 2. 6. 18:26
๋ฐ˜์‘ํ˜•

 

์ฝ”๋“œ๋Š” ์•„๋ž˜ github์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

https://github.com/deslog/awesome-swift

 

GitHub - deslog/awesome-swift: swift๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋“  ๊ณต๋ถ€๋ฅผ ๋ชจ์•„๋‘๋Š” ๊ฐ์ž์˜ ๋š๋”ฑ๋š๋”ฑ ์š”๋ฆฌ์‹คํ—˜์‹ค ๐Ÿฅ”๐Ÿณ

swift๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋“  ๊ณต๋ถ€๋ฅผ ๋ชจ์•„๋‘๋Š” ๊ฐ์ž์˜ ๋š๋”ฑ๋š๋”ฑ ์š”๋ฆฌ์‹คํ—˜์‹ค ๐Ÿฅ”๐Ÿณ๐Ÿ‘ฉ๐Ÿป‍๐Ÿณ. Contribute to deslog/awesome-swift development by creating an account on GitHub.

github.com


๐Ÿ‘‹ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด ๊ณต๋ถ€ํ•˜๊ธฐ ์ „์— ์•Œ์•„์•ผ ํ•  ๊ฐœ๋…!

๐Ÿ”– ๋””์ž์ธํŒจํ„ด์ด๋ž€?

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค์„ ๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋ฆฌ ํ˜•์‹์„ ์ •ํ•ด๋†“๋Š” ๊ฒƒ? ๋ฐฉ๋ฒ•๋ก ? ์ด๋‹ค! ๋ฏธ๋ฆฌ ์ข‹์€ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์ •์˜ํ•ด๋‘๊ณ , ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฉ๋ฒ•๋ก ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋””์ž์ธํŒจํ„ด! ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค ~

๐Ÿ”– ๋””์ž์ธํŒจํ„ด์˜ ๋ถ„๋ฅ˜?

์ƒ์„ฑ, ๊ตฌ์กฐ, ํ–‰์œ„ ํŒจํ„ด ์„ธ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค. ์ด๋ฒˆ์— ์•Œ์•„๋ณผ ์‹ฑ๊ธ€ํ„ดํŒจํ„ด์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ฅ˜๋Š” '์ƒ์„ฑ'์— ์†ํ•œ๋‹ค.

๐Ÿ”– ํด๋ž˜์Šค์™€ ๊ฐ์ฒด

ํด๋ž˜์Šค์™€ ๊ฐ์ฒด์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผํ•œ๋‹ค. ํด๋ž˜์Šค๋Š” ์ฝ”๋“œ๋ฅด ์ž‘์„ฑํ• ๋•Œ ๋ฏธ๋ฆฌ ํ˜•ํƒœ๋ฅผ ์งœ๋†“๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด ๋นตํ‹€!! ์ผ์ •ํ•œ ๋นต์„ ์ฐ์–ด๋‚ด๊ธฐ ์ „์— ๋งŒ๋“ค์–ด๋†“๋Š” ํ‹€์„ ์˜๋ฏธํ•œ๋‹ค.

๊ฐ์ฒด๋Š”, ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ object๋ฅผ ๋งํ•œ๋‹ค. ์œ„์—์„œ ์ •์˜ํ•œ ํด๋ž˜์Šค์— ๊ธฐ๋ฐ˜ํ•œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค๋ฉด ๊ฐ์ฒด! (์ฝ”๋“œ์—์„œ ๋งŒ๋“ค์–ด์กŒ๋‹ค, ๋ผ๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ”๋‹ค~ ํ•˜๋Š” ์˜๋ฏธ์ด๋‹ค.) ์ฃผ๋กœ '์ธ์Šคํ„ด์Šคํ™”'ํ•œ๋‹ค ๋ผ๊ณ  ๋งํ•˜๋Š”๋ฐ, ์ธ์Šคํ„ด์Šคํ™” ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๋†ˆ์ด ๋ฐ”๋กœ ๊ฐ์ฒด์ด๋‹ค.

// Cat ํด๋ž˜์Šค
class Cat {
	var ๋ฌด๋Šฌ: String
    var ๋ชธ๋ฌด๊ฒŒ: Int
}

// ๋ฏธ์œ ๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
// ๋ฏธ์œ ๋Š” class Cat ์œผ๋กœ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด์ด๋‹ค.
// ์น˜์ฆˆ๋ฌด๋Šฌ์™€ 4ํ‚ค๋กœ์˜ ๋ชธ๋ฌด๊ฒŒ๋ฅผ ๊ฐ–๋Š”๋‹ค.
let meyou = Cat()
meyou.๋ฌด๋Šฌ = "์น˜์ฆˆ"
meyou.๋ชธ๋ฌด๊ฒŒ = 4

 

โšซ๏ธ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์˜ ๊ฐ„๋‹จํ•œ ์ •์˜

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

๐Ÿ”– ์ฃผ๋กœ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋‚˜์š”?

APIํ˜ธ์ถœํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค. API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํด๋ž˜์Šค(๋งค๋‹ˆ์ €)๋ฅผ ๋งŒ๋“ค์–ด๋†“๊ณ , ์–˜๋ฅผ ํ•œ๋ฒˆ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•ด๋‘๋ฉด, ์ด ๊ฐ์ฒด๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ ๋œ๋‹ค.

 

โšซ๏ธ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด xcode๋กœ ์‚ดํŽด๋ณด๊ธฐ

๊ทธ๋ž˜์„œ ์‹ฑ๊ธ€ํ„ดํŒจํ„ด์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๊ฑด๋ฐ? xcode๋กœ ์•„์ฃผ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์ž.

 

1๏ธโƒฃ ์šฐ์„ , ์‹ฑ๊ธ€ํ„ดํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„๋•Œ๋ฅผ ์‚ดํŽด๋ณด์ž.

๐Ÿ”– singleton class ์ƒ์„ฑ

xcode๋กœ App ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์ฃผ๊ณ , ํ•˜๋‚˜์˜ swift ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ class ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.
๋‚˜๋Š” MySingleton์ด๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , MySingleton์ด๋ผ๋Š” class๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. 

// MySingleton

import Foundation

final class MySingleton: NSObject { }

๐Ÿ”– view์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด class๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด view์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

// MySingletonViewController

class MySingletonViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let firstObject = MySingleton()
        let secondObject = MySingleton()
    }

๋‚˜๋Š” ์ด๋ ‡๊ฒŒ MySingletonViewController๋ผ๋Š” ๋ทฐ์ปจ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ๊ทธ ๋‚ด๋ถ€์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค. ์ด์ œ ์–ด๋–ป๊ฒŒ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋๋Š”์ง€ ์‚ดํŽด๋ณด์ž. 

๐Ÿ”– ๋””๋ฒ„๊น…์„ ํ†ตํ•ด์„œ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ ์‚ดํŽด๋ณด๊ธฐ

์•ž์—์„œ, ์ฝ”๋”ฉ์—์„œ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ก‹๋‹ค = ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ”๋‹ค ์˜๋ฏธ์ž„์„ ๋จผ์ € ์„ค๋ช…ํ–ˆ๋‹ค. ๊ฐ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

๋จผ์ € ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฐ”๋กœ ๋‹ค์Œ์ค„์— breakpoint๋ฅผ ์ฐ์–ด์ฃผ๊ณ ! run์„ ๋Œ๋ ค๋ณด์ž.
๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ์•„๋ž˜ ์ฝ˜์†”์ฐฝ์—์„œ LLDB ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€์žˆ๋Š”์ง€ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!

po <๊ฐ์ฒด์ด๋ฆ„>

ํ™•์ธํ•ด๋ณด๋‹ˆ๊นŒ, firstObject์™€ secondObject๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์กŒ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ, ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹ฑ๊ธ€ํ„ด์ด ์•„๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ„ด์€, ๊ฐ์ฒดํ™” ์‹œ์ผœ๋†“๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง€์†์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ์ž ์ด์ œ ์ œ๋Œ€๋กœ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๋งŒ๋“ค์–ด๋ณด์ž.

 

2๏ธโƒฃ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ๋งŒ๋“ค๊ธฐ

๐Ÿ”– ์‹ฑ๊ธ€ํ†ค class ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž.

// MySingleton 

import Foundation

final class MySingleton: NSObject {

    static let shared = MySingleton()

    private override init() { }
}

MySingleton์ด๋ผ๋Š” final class๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์•ˆ์— ์ž๊ธฐ ์ž์‹ ์„ ๋ฐ”๋ผ๋ณด๊ณ ์žˆ๋Š” shared๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์คฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  init๊นŒ์ง€ ์™„๋ฃŒ.

๐Ÿ”– ์ด์ œ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž

์•ž์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋™์ผํ•œ MySingletonViewController์—๋‹ค๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ์‚ดํŽด๋ณด์ž. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ LLDB๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

class MySingletonViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let firstObject = MySingleton.shared
        let secondObject = MySingleton.shared
    }
}

breakpoint๋ฅผ ๊ฑธ์–ด์ฃผ๊ณ  ๋””๋ฒ„๊น…์„ ํ•ด๋ณด๋ฉด?

์งœ์ž”, ์ด๋ ‡๊ฒŒ ๋‘๊ฐœ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์ด ๊ฐ™๋‹ค. ์ด๋ฏธ fisrtObject์—์„œ ์ƒ์„ฑ๋˜์–ด ์˜ฌ๋ผ๊ฐ€์žˆ๋Š” MySingleton์„ secondObjcect๋„ ์‚ฌ์šฉํ•˜๊ณ  ์ž‡๋‹ค. ์ด๋ ‡๊ฒŒ ์ด๋ฏธ ์˜ฌ๋ผ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ง€์†์ ์œผ๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋‹ค.

 

โšซ๏ธ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ์“ฐ๋Š” ์ด์œ 

๐Ÿ”– ์žฅ์ 

์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ง€์†์ ์œผ๋กœ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐ€์ง€๋Š” ์žฅ์ ์€, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๋˜ํ•œ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ตฌํ˜„ํ•œ ์ธ์Šคํ„ด์Šค๋Š” '์ „์—ญ'์ด๋ฏ€๋กœ, ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์žฅ์ ์ด๋‹ค.

๐Ÿ”– ์ฃผ๋กœ ์–ธ์ œ ์“ฐ๋‚˜์—ฌ?

์ฃผ๋กœ ๊ณตํ†ต๋œ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑํ•ด์„œ ๊ฐ™์ด ์จ์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด.,, ํ•˜๋‚˜์˜ Manager๋ฅผ ๋งŒ๋“ค์–ด๋†“๋Š”๋‹ค๊ฑฐ๋‚˜? ์ด๋Ÿฐ๊ฒฝ์šฐ.. DB์—์„œ๋Š” ์Šค๋ ˆ๋“œํ’€, ๋กœ๊ทธ๊ธฐ๋ก ๊ฐ์ฒด ๋“ฑ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. 

 

โšซ๏ธ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๋‹จ์ 

์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๊ฐ€ ํ˜ผ์ž ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•˜๊ฑฐ๋‚˜, ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ์‹œํ‚ค๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง„๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๊ฒŒ ๋˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™ ์ค‘์— '๊ฐœ๋ฐฉ ํ์‡„ ์›์น™ (Open Closed Principle, OCP)'๋ฅผ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋œ๋‹ค. 

OCP๋ž€ ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค. ๊ณ ๋กœ, ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐœ๋ฐฉ์ ์ด๊ณ , ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ํ์‡„์ ์ด์–ด์•ผ ํ•œ๋‹ค. ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง€๊ฒŒ ๋˜๋ฉด, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค์–ด์ง€๊ณ , ํ…Œ์ŠคํŠธ๋„ ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰ํ•ด์ฃผ๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค.

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

 

โœ… Singleton Pattern์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด, ์•ฑ ํผํฌ๋จผ์Šค์— ์˜ํ–ฅ์„ ์ฃผ๋Š”๊ฐ€?

์• ํ”Œ ๋””๋ฒจ๋กœํผ ์•„์นด๋ฐ๋ฏธ์—์„œ๋Š” ์• ํ”Œ ์ง์›๋“ค๊ณผ ๋งŽ์€ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. (๋‚ด๊ฐ€ ์˜์–ด๋ฅผ ๋ชปํ•ด์„œ ์ ๊ทน์ ์ธ ์†Œํ†ต์„ ๋ชปํ–ˆ๋‹ค๋Š”๊ฒŒ ์ •๋ง,, ์ธ์ƒ์˜ ํ•œ์ด๋‹ค. ์• ํ”Œ ๋ณธ์‚ฌ ๊ฐœ๋ฐœ์ž๋“ค์ด๋ž‘ ์ด์•ผ๊ธฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ!)

์Œ,, ๊ฑฐ๊ธฐ์„œ ๋‚˜์™”๋˜ ์ฃผ์ œ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ์ด์ฃผ์ œ์˜€๋‹ค. ์•„์ง ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์•ฑ์„ ๊ฐœ๋ฐœํ•ด๋ณธ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ด๋Š” ์•ˆ๊ฐ€์ง€๋งŒ, ์ผ๋‹จ ์ง€๊ธˆ๊นŒ์ง€ ์ดํ•ดํ•œ ๋ฐ”๋กœ๋Š”,,,

  • cpu๊ด€์ ์—์„œ ๋ณผ ๋•Œ, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์กฐํšŒํ•˜๋Š” ๋งค์šฐ ๋นˆ๋ฒˆํ•œ call-site๊ฐ€ ์—†๋Š” ํ•œ, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด ์•ฑ ํผํฌ๋จผ์Šค์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒƒ์€ ์•ฑ์ด ์‹คํ–‰๋˜๋Š” ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์˜ ๊ด€์ ์—์„œ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์˜์›์ด ์กด์žฌํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๊ทผ๋ฐ, ์ด ์‹ฑ๊ธ€ํ†ค๋“ค์ด ์ ์  ์ปค์ง€๋ฉด ๋‹น์—ฐํžˆ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ๊ทธ๋ž˜ํ”„ ๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด์„œ ์•ฑ์ด ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋“ค๊ณผ, ์‹ฑ๊ธ€ํ†ค๊ณผ ๊ด€๋ จ๋œ ์ „์—ญ๋ณ€์ˆ˜๋“ค์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์•ฑ์˜ ํผํฌ๋จผ์Šค๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์— ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

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

๋” ๊ณต๋ถ€ํ•˜๊ณ  ๋‹ค์‹œ ํ•ด๋‹น ๋‹ต๋ณ€์„ ์‚ดํŽด๋ด์•ผ์ง€...  (ํ•ด๋‹น ๋‹ต๋ณ€์€ ์ œ ํ•ด์„๋Œ€๋กœ , ์ƒ๊ฐ๋Œ€๋กœ ์žฌ๊ตฌ์„ฑํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์˜์–ด๋กœ ๋‹ต๋ณ€ํ•ด์ฃผ์…จ๊ณ ,,, ์›๋ณธ ๋‹ต๋ณ€์€ ์• ํ”Œ ์•„์นด๋ฐ๋ฏธ ๋‚ด๋ถ€์ž๋ฃŒ๋กœ ์œ ์ถœ์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค ๐Ÿซ )

 


 

์ด๋ ‡๊ฒŒ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ดค๋‹ค. ์‚ฌ์‹ค ์•„์ง ์•ฑ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š์€ ํ„ฐ๋ผ, ์ž˜ ๊ณต๊ฐ์€ ๋˜์ง€ ์•Š๋Š”๋‹ค. ํŠนํžˆ, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ๋งˆ์ง€๋ง‰ ์งˆ๋ฌธ์ฒ˜๋Ÿผ '์•ฑ ํผํฌ๋จผ์Šค์— ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๋Š”๊ฐ€'์™€ ๊ฐ™์€ ์งˆ๋ฌธ๋“ค์— ๋Œ€ํ•ด์„œ ๊นŠ๊ฒŒ ๊ณ ๋ฏผํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•