์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋ ๋, ์ด๋ค ํด๋์ค๊ฐ ์ต์ด ํ ๋ฒ๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น(static)ํ๊ณ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ํจํด
์ฆ, ์ฑ๊ธํค ํจํด์ 'ํ๋'์ ์ธ์คํด์ค๋ง ์์ฑํ์ฌ ์ฌ์ฉํ๋ ๋์์ธ ํจํด์ด๋ค.
์์ฑ์๊ฐ ์ฌ๋ฌ๋ฒ ํธ์ถ๋๋, ์ค์ ๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ ํ๋์ด๋ฉฐ ์ต์ด๋ก ์์ฑ๋ ์ดํ์ ํธ์ถ๋ ์์ฑ์๋ ์ด๋ฏธ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๋ฐํ์ํค๋๋ก ๋ง๋ ๋ค.
๊ฐ์ฒด๋ฅผ ํ๋๋ง ์์ฑํ์ฌ ์ฌ๋ฌ ๊ณณ์์ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์ธ์คํด์ค๊ฐ ํ์ํ ๋, ๋๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ์๊ณ ๊ธฐ์กด์ ์ธ์คํด์ค๋ฅผ ํ์ฉํจ!
์์ ๋ฅผ ํตํด ์์๋ณด๋๋ก ํ์. ์๋์ ๊ฐ์ด ์ ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ํด๋์ค๊ฐ ์๋ค.
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)์ด ์ ์ฅ๋๋ ๊ฒ์ ์ํ๋ค๊ณ ํ์.
์ด๋ด ๋ ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํด์ ํด๋์ค์ ๋ํ ์ธ์คํด์ค๋ ์ต์ด ์์ฑ์์ ์ ์ญ์ผ๋ก ์ ์ฅํด๋๊ณ , ์ดํ์ ์ด ์ ์ญ ์ธ์คํด์ค์ ์ ๊ทผํ๋๋ก ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ ๊ฒ ํ ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๊ณณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ด ๋ฐ๋ก ์ฑ๊ธํค์ด๋ค.
์ฑ๊ธํค์ ์ฌ์ฉํ๋ฉด ์์ฑ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์ฌ์ฉํ์ง ์์ ๋์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
๋จผ์ ์ ์ญ์ผ๋ก ์ ์ฅ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ static ํค์๋๋ฅผ ์ด์ฉํด ํด๋์ค ์์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ ํ๋กํผํฐ๋ฅผ ํ๋ ์์ฑํ๋ค.
์ฑ๊ธํค ํจํด์ ์ฐธ์กฐ ํ์ ๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ class๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
class UserInfo {
static let shared = UserInfo()
var id: String?
var pw: String?
var name: String?
}์์ฑ์์ธ init()์ private๋ก ์ ๊ทผ์ ์ด๋ฅผ ํด์ค๋ค.
์ธ๋ถ์ ์ ๊ทผ์ ์ฐจ๋จ์์ผ UserInfo ํด๋์ค์ shared ์ธ์คํด์ค๋ก๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ด ์ฑ๊ธํค ํจํด์ด๋ค.
class UserInfo {
static let shared = UserInfo()
var id: String?
var pw: String?
var name: String?
private init() { }
}์์์ ๋ง๋ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ธ๋ถ์์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ์์ฑํด์ค 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 ?? "")์ฑ๊ธํคย ํจํด์ย ์ ์ญย ์ํ(Globalย State)๋กย ์ด์ฉํ ย ์ย ์๋ค๋ย ์ฅ์ ์ดย ์์ง๋งย ๋ค์๊ณผย ๊ฐ์ย ๋ฌธ์ ์ ์ย ๊ฐ์ง๊ณ ย ์์ดย ์ํฐย ํจํด์ผ๋ก๋ย ๋ง์ดย ๋ถ๋ฆฐ๋ค.
- private ์์ฑ์๋ฅผ ๊ฐ๊ณ ์์ด ์์์ด ๋ถ๊ฐ๋ฅํ๋ค.
- ํ ์คํธํ๊ธฐ ํ๋ค๋ค.
- ์๋ฒ ํ๊ฒฝ์์๋ ์ฑ๊ธํค์ด 1๊ฐ๋ง ์์ฑ๋จ์ ๋ณด์ฅํ์ง ๋ชปํ๋ค.
- ์ ์ญ ์ํ๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์งํ์ง ๋ชปํ๋ค.
- private ์์ฑ์๋ฅผ ๊ฐ๊ณ ์์ด ์์์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ฑ๊ธํค์ ์์ ๋ง์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ก ์์ฑ์๋ฅผ private์ผ๋ก ์ ํํ๋ค. ํ์ง๋ง ์์์ ํตํด ๋คํ์ฑ์ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ค๋ฅธ ๊ธฐ๋ณธ์์ฑ์๊ฐ ํ์ํ๋ฏ๋ก ๊ฐ์ฒด์งํฅ์ ์ฅ์ ์ ์ ์ฉํ ์ ์๋ค. ๋ํ ์ฑ๊ธํค์ ๊ตฌํํ๊ธฐ ์ํด์๋ ๊ฐ์ฒด์งํฅ์ ์ด์ง ๋ชปํ static ํ๋์ static ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ย ย
- ํ ์คํธํ๊ธฐ ํ๋ค๋ค. ์ฑ๊ธํค์ ํ ์คํธํ๊ธฐ๊ฐ ํ๋๋ฉฐ ํ ์คํธ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ถ๊ฐ๋ฅํ ์ ์๋ค. ์ฑ๊ธํค์ ์์ฑ ๋ฐฉ์์ด ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ Mock ๊ฐ์ฒด๋ก ๋์ฒดํ๊ธฐ๊ฐ ์ด๋ ค์ฐ๋ฉฐ, ๋์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๊ธฐ๋ ํ๋ค๋ค. ํ ์คํธ๋ ๊ฐ๋ฐ์ ํต์ฌ์ธ๋ฐ, ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ํฐ ๋จ์ ์ด ๋๋ค. ย ย
- ์๋ฒ ํ๊ฒฝ์์๋ ์ฑ๊ธํค์ด 1๊ฐ๋ง ์์ฑ๋จ์ ๋ณด์ฅํ์ง ๋ชปํ๋ค. ์๋ฒ์์ ํด๋์ค ๋ก๋๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋๋์ ๋ฐ๋ผ ์ฑ๊ธํค ํด๋์ค์์๋ ๋ถ๊ตฌํ๊ณ 1๊ฐ ์ด์์ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง ์ ์๋ค. ๋ฐ๋ผ์ Java ์ธ์ด๋ฅผ ์ด์ฉํ ์ฑ๊ธํค ๊ธฐ๋ฒ์ ์๋ฒ ํ๊ฒฝ์์ ์ฑ๊ธํค์ด ๊ผญ ๋ณด์ฅ๋๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ํ ์ฌ๋ฌ ๊ฐ์ JVM์ ๋ถ์ฐ๋ผ์ ์ค์น๋๋ ๊ฒฝ์ฐ์๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค. ย ย
- ์ ์ญ ์ํ๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์งํ์ง ๋ชปํ๋ค. ์ฑ๊ธํค์ ์คํํฑ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์ธ์ ๋ ์ง ํด๋น ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ ์ญ ์ํ(Global State)๋ก ์ฌ์ฉ๋๊ธฐ ์ฝ๋ค. ์๋ฌด ๊ฐ์ฒด๋ ์์ ๋กญ๊ฒ ์ ๊ทผํ๊ณ ์์ ํ๋ฉฐ ๊ณต์ ๋๋ ์ ์ญ ์ํ๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๊ถ์ฅ๋์ง ์๋๋ค. ย ์ฑ๊ธํค ํจํด์ ๊ฐ์ฒด๋ฅผ 1๋ฒ ์์ฑํ๊ณ ์ฌ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ผ๋ฏ๋ก ์ฑ๊ธํค ํจํด์ด ํ์ํ ๊ฒฝ์ฐ๋ ๋ถ๋ช ํ ์๋ค. ํ์ง๋ง ์ฑ๊ธํค ํจํด์ ์ง์ ๊ตฌํํ๋ฉด ๋ค๋ฅธ ๋จ์ ๋ค์ด ๋๋ฌด ํฌ๊ฒ ๋ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ํ์ฉ์ด ์ฝ์ง ์๋ค.ย ๋ง์ฝ ํ๋ ์์ํฌ์๊ฒ ์ฑ๊ธํค์ ์์ํ ์ ์๋ค๋ฉด ์์ ๊ฐ์ ๋จ์ ๋ค์ ๋ง์ด ํด๊ฒฐํ ์๋ ์๋ค.
[Swift] ์ฑ๊ธํค ํจํด(Singleton Pattern)
[๋์์ธ ํจํด] ์ฑ๊ธํค ํจํด(Singleton pattern)