์๋ ํ์ธ์ ๊ฐ์์ ๋๋ค. ์ด๋ฒ์๋ ์ด๊ธฐํ๊ตฌ๋ฌธ init ๊ฐ๋ ์ ๋ํด์ ๊ณต๋ถํด๋ดค์ต๋๋ค. ์ด์ ๊ฒ์๊ธ ํด๋์ค์ ๊ตฌ์กฐ์ฒด์์ ์ด๊ธฐํ๊ตฌ๋ฌธ์ ๋ํ ์ธ๊ธ์ด ์ ๊น ๋์๋๋ฐ, ๊ฐ๋ ์ ์กฐ๊ธ ๋ ์ก์๋ณด๊ธฐ ์ํด ์ถ๊ฐ๊ณต๋ถ๋ฅผ ์งํํ์ต๋๋ค. ๊ทธ๋ผ ์์!
์ด๊ธฐํ (initialization) ์ด๋?
ํด๋์ค๋ ๊ตฌ์กฐ์ฒด ๋๋ ์ด๊ฑฐํ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ค๋น ๊ณผ์ ์ด๋ค. ์ธ์คํด์ค์ ์ด๊ธฐํ๋ฅผ ๋ด๋นํ๋ ๊ฒ์ด ๋ฐ๋ก ์ด๊ธฐํ ์์ฑ์ (initializer) ์ด๋ค. ์ด๊ธฐํ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์ธ์คํด์ค์ ํ๋กํผํฐ๋ง๋ค ์ด๊ธฐ๊ฐ์ ์ค์ ํด์ฃผ๊ณ ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ํ์ํ ์ค์ ์ ํด์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
struct User {
var nickname: String = "potato"
var age: Int = 0
init() {
// ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฉด ํธ์ถ
}
}
let user = User() //์ธ์คํด์ค
์ ์ฝ๋์์ ๋ณด๋ฉด, user ์ธ์คํด์ค๊ฐ ์คํ๋ ๋ init ๋ธ๋ก ์์์๋ ์ฝ๋๊ฐ ์คํ๋๋ค. ์ด๋ ํ๋กํผํฐ๋ค์ ์ด๊ธฐ๊ฐ์ ์ค์ ํด์ฃผ๊ฑฐ๋ ์ ์ธ์คํด์ค๋ฅผ ์ค์ ํ๊ธฐ์ ์ ์ ์ํด์ฃผ๋ฉด ๋๋ค.
์ด๊ธฐํ ๊ตฌ๋ฌธ
์ด๊ธฐํ ๊ตฌ๋ฌธ์ ๊ธฐ๋ณธ ํํ๋ ์๋์ ๊ฐ๋ค.
init (๋งค๊ฐ๋ณ์: ํ์
, .... ) {
// ํ๋กํผํฐ ์ด๊ธฐํ
// ์ธ์คํด์ค ์์ฑ์ ํ์ํ ์ค์ ์ ํด์ฃผ๋ ์ฝ๋ ์์ฑ
}
๋งค๊ฐ๋ณ์์ ์ด๋ฆ๋ง ๋ค๋ฅด๊ฒ ํด์ฃผ๋ฉด, ์ฌ๋ฌ๊ฐ์ ์์ฑ์ ๋ํ ๋ง๋ค ์ ์๋ค.
โถ ์์
class User() {
var nickname: String
var age: Int
// init์ ํ์ฉํ์ฌ ํ๋กํผํฐ์ ๊ฐ์ ์ด๊ธฐํ ์์ผ์ฃผ์.
init(nickname: String, age: Int) {
self.nickname = nickname
self.age = age
}
}
// ์ธ์คํด์ค ์์ฑ
var user = User(nickname: "potato", age: 25)
user.nickname // prints "potato"
user.age // prints 25
โถ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ฐ์ง ์๊ณ ์์ฑ์ ์์์ ํ๋กํผํฐ์ ๊ฐ์ ๋์ ํด์ ์ด๊ธฐํ๋ ๊ฐ๋ฅํ๋ค. ์์๋ ๋ค์๊ณผ ๊ฐ๋ค
class User() {
var nickname: String
var age: Int
// init์ ํ์ฉํ์ฌ ํ๋กํผํฐ์ ๊ฐ์ ์ด๊ธฐํ ์์ผ์ฃผ์.
init(nickname: String, age: Int) {
self.nickname = nickname
self.age = age
}
init(age: Int) {
self.nickname = "albert"
self.age = age
}
}
// ์ธ์คํด์ค ์์ฑ
var user2 = User(age:30)
user2.nickname //prints "albert"
user.age //prints 30
user2๋ฅผ ์์ฑํ ๋ ์๋์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฌ๋ค.
์ฌ๊ธฐ์ age๋ง ํ๋ผ๋ฏธํฐ๋ก ์ ๋ ฅํด์ฃผ์๊ธฐ ๋๋ฌธ์, nickname์ ์ด๊ธฐ๊ฐ์ผ๋ก albert๋ฅผ ๊ฐ์ง๋ค.
์ด๋ ๊ฒ ๊ธฐ๋ณธ ์ ๊ณต๋๋ ์์ฑ์ ์ด์ธ์ ์ฌ์ฉ์ ์ ์ ์์ฑ์๋ฅผ ์ด์ฉํด์ ์์ฑ์๋ฅผ ์ ์ํ ์๋ ์๋ค. ๋ํ ์ด๋ฌํ ์์ฑ์์ ๋ฐ๋๋๋ ์ญํ ์ ํ๋ ๊ฒ๋ ์กด์ฌํ๋ค. ๋ฐ๋ก deinit(๋์ด๋์ ๋ผ์ด์ ) ๋ผ๋ ๊ฒ์ด๋ค.
deinit ์ด๋? (Deinitialization, ์๋ฉธ์)
์์ ์ธ๊ธํ๋ฏ, init๊ณผ ๋ฐ๋๋๋ ์ญํ ์ ํ๋ค. ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ํด์ ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๊ณ ํด๋์ค ์ธ์คํด์ค์ ๊ด๋ จํ์ฌ ์ํ๋ ์ ๋ฆฌ์์ ์ ๊ตฌํํ ์ ์๋ค. ๋จ, deinit(๋์ด๋์ ๋ผ์ด์ )๋ ํด๋์ค์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Swfit๋ ํน์ ํด๋์ค ์ธ์คํด์ค๊ฐ ๋ ์ด์ ํ์ ์์ด์ง ๋ ์๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ธฐ ์ํด์๋ค. Swift๋ ์ด๋ฌํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ Automatic Reference Counting (ARC)๋ผ๋ ๋ฐฉ์์ผ๋ก ์ํํ๋ค. (์ด์ ํด๋์ค ๊ด๋ จ ํฌ์คํ ์์ ํด๋์ค๋ ARC ๋ฐฉ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค๋ ์ธ๊ธ์ด ์์๋ค. ์ถํ ์์ธํ ํฌ์คํ ์ผ๋ก ๊ณต๋ถํด๋ณด๋๋ก ํ์.)
์ ํ์ ์ผ๋ก ํน์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์์์ ํด์ ํ๊ณ ์ถ์ ๋ ์๋์ ์ผ๋ก ํด๋น ์ธ์คํด์ค๋ฅผ ์ ๋ฆฌํ ํ์๊ฐ ์๋ค. ARC๋ ๋์ด์ ํ์์๋ ์ธ์คํด์ค์ ๋ํด์ ์๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น/ํด์ ์ฝ๋๋ฅผ ์คํํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ๋๋๋ก ๊ฐ์ธ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด์ค ํ์๊ฐ ์์์๋ ์๋ค. ์ด๋ด๋๋ฅผ ์ํด์ ํด๋์ค ๋ด๋ถ์๋ ์ต๋ ํ๊ฐ ๊น์ง deinit ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
์์๋ฅผ ์ดํด๋ณด์.
class User() {
var nickname: String
var age: Int
// init์ ํ์ฉํ์ฌ ํ๋กํผํฐ์ ๊ฐ์ ์ด๊ธฐํ ์์ผ์ฃผ์.
init(nickname: String, age: Int) {
self.nickname = nickname
self.age = age
}
init(age: Int) {
self.nickname = "albert"
self.age = age
}
deinit() {
//์ํ๋ ์ ๋ฆฌ์์
๊ตฌํ
print("deinit user")
}
var user3: User? = User(age: 23)
user3 = nil
//prints "deinit user."
์ deinit user๊ฐ ์ถ๋ ฅ๋ ๊น? Swift๋ ๋์ด์ ์ธ์คํด์ค๊ฐ ํ์๊ฐ ์๋ค๊ณ ์๊ฐ๋๋ฉด, ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ฉธ์์ผ๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์ nil์ด ๋๋ฉด, ์ธ์คํด์ค๊ฐ ๋์ด์ ํ์ํ์ง ์๋ค๊ณ ํ๋จ๋์ด deinit์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค :)