[Swift] ์ด๊ธฐํ
์ด๊ธฐํ (Initialization)
- ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ค๋น ์์ ์ ํ๋ ๋จ๊ณ
- ๊ฐ ์ ์ฅ ํ๋กํผํฐ์ ์ด๊ธฐ ๊ฐ์ ์ค์ →initializer๋ฅผ ์ ์ ํ๋ ๊ฒ์ผ๋ก ๊ตฌํ
์ ์ฅ ํ๋กํผํฐ๋ฅผ ์ํ ์ด๊ธฐ๊ฐ ์ค์
์ธ์คํด์ค์ ์ ์ฅ ํ๋กํผํฐ๋ ์ฌ์ฉํ๊ธฐ ์ ๋ฐ๋์ ํน์ ๊ฐ์ผ๋ก ์ด๊ธฐํ ๋ผ์ผ ํจ (๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ค์ /ํน์ ๊ฐ์ผ๋ก ์ค์ ๊ฐ๋ฅ)
NOTE
initializer์์ ์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ ์ง์ ์ค์ ํ๋ฉด ํ๋กํผํฐ ์ต์ ๋ฒ๊ฐ ํธ์ถ๋์ง ์๊ณ ๊ฐ ํ ๋น์ด ์ํ
์ด๋์ ๋ผ์ด์
ํน์ ํ์ ์ ์ธ์คํด์ค ์์ฑ (์ด๋์ ๋ผ์ด์ ์ ๊ฐ์ฅ ๊ฐ๋จํ ํํ_ ํ๋ผ๋ฏธํฐ ์์ด init ํค์๋ ์ฌ์ฉ)
init() {
// perform some initialization here
}
๊ธฐ๋ณธ ํ๋กํผํฐ
ํ๋กํผํฐ ์ ์ธ๊ณผ ๋์์ ๊ฐ์ ํ ๋น, ์ด ๊ฐ์ ์ด๊ธฐ ๊ฐ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ.
NOTE
ํญ์ ๊ฐ์ ์ด๊ธฐ ๊ฐ์ ๊ฐ๋๋ค๋ฉด ๊ธฐ๋ณธ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์
ํ๋กํผํฐ์ ํ์ ์ ์ ์ธํ์ง ์์๋ ์ปดํ์ผ๋ฌ๋ ์ด๊ธฐ ๊ฐ์ ์ฐธ์กฐํด์ ํ์ ์ ์ถ๋ก ํ ์ ์์
์ด ๊ธฐ๋ณธ๊ฐ์ ์์์ ํจ๊ป ์์
์ปค์คํฐ๋ง์ด์ง ์ด๊ธฐํ
์ด๊ธฐํ ํ๋ก์ธ์ค๋ฅผ ์ ๋ ฅ ๊ฐ๊ณผ ์ต์ ๋ ํ๋กํผํฐ ํ์ /์์ ๊ฐ์ ํ ๋น, ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ
์ด๊ธฐํ ํ๋ผ๋ฏธํฐ
์ด๊ธฐํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํด ์ฌ์ฉํ ์ ์์
ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ์ธ์ ๋ ์ด๋ธ
๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ์ด๊ธฐํ ํ๋ผ๋ฏธํฐ ๋ชจ๋ ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ์ธ์ ๋ ์ด๋ธ์ ๊ฐ์ง๋ง, ์ด๋์ ๋ผ์ด์ ๋ ํน์ ๋ฉ์๋์์ ์ง์ ํ๋ ๋ฉ์๋ ์ด๋ฆ์ ์ง์ ํ์ง ์๊ณ ์ด๋์ ๋ผ์ด์ ์๋ณ์๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉ
๐ก
๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ ์ธ์ ๋ ์ด๋ธ์ ๊ฐ๊ณ ์ฌ์ฉ์๊ฐ ์ง์ ํ์ง ์์ ์, Swift๊ฐ ์๋์ผ๋ก ํ๋๋ฅผ ํ ๋นํด ์ ๊ณต
์ธ์ ๋ ์ด๋ธ์ด ์๋ ์ด๋์ ๋ผ์ด์ ํ๋ผ๋ฏธํฐ
์ฝ๋๋ฅผ ์์ฑํ ๋ ์ธ์ ๋ ์ด๋ธ์ ์๋ตํ๋ ๊ฒ์ด ๋ ๋ช ๋ฃํ ๊ฒฝ์ฐ ' _ ๊ธฐํธ' ๋ฅผ ์ฌ์ฉํด ์ด๋์ ๋ผ์ด์ ์์ ์ธ์ ๋ ์ด๋ธ์ ์๋ต
์ต์ ๋ ํ๋กํผํฐ ํ์
ํ๋กํผํฐ ์ต์ด ๊ฐ์ด ์๊ณ ๋์ค์ ์ถ๊ฐ๋ ์ ์๋ ๊ฐ์ ์ต์ ๋๋ก ์ ์ธํด ์ฌ์ฉ (์ต์ ๋ ํ๋กํผํฐ๋ ์๋์ผ๋ก nill๋ก ์ด๊ธฐํ)
์ด๊ธฐํ ์ค์ ์์ ํ๋กํผํฐ ํ ๋น
์ด๋์ ๋ผ์ด์ ธ์์ ์์ ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๋ ๊ฒ ๊ฐ๋ฅ
NOTE
ํด๋์ค ์ธ์คํด์ค์์ ์์ ํ๋กํผํฐ๋ ์ด๊ธฐํ ์ค ๊ทธ ํด๋์ค ์์์๋ง ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๊ณ ์๋ธํด๋์ค์์๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅ
ํ๋กํผํฐ๋ฅผ let์ผ๋ก ์ ์ธํด์ ์ด ํ๋กํผํฐ๋ ์ฒ์์ ์ด๊ธฐํ ๋๋ฉด ๋ณ๊ฒฝ๋์ง ์๋ ํ๋กํผํฐ๋ผ๋ ๊ฒ์ ํํ
๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์
๋ง์ฝ ๋ชจ๋ ํ๋กํผํฐ์ ์ด๊ธฐ๊ฐ์ด ์ค์ ๋ผ ์๊ณ , ํ๋์ ์ด๊ธฐ์๋ ์ ์ํ์ง ์์๋ค๋ฉด Swift๋ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ด๊ธฐํ ํ๋ ๊ธฐ๋ณธ ์ด๊ธฐ์๋ฅผ ์ ๊ณต
๊ตฌ์กฐ์ฒด ํ์ ์ ์ํ ๋ฉค๋ฒ์ชฝ ์ด๋์ ๋ผ์ด์ (ํ๋กํผํฐ์ ์ด๋ฆ์ ๋งค๊ฐ๋ณ์๋ก ๊ฐ๋ ์ด๋์ ๋ผ์ด์ )
๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์ ์ ๋ค๋ฅด๊ฒ ๋งด๋ฒ์ชฝ ์ด๋์ ๋ผ์ด์ ๋ ํ๋กํผํฐ๊ฐ ๊ธฐ๋ณธ ๊ฐ์ด ์์ด๋ ์ปค์คํ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ ์ํ์ง ์์๋ค๋ฉด ๋ฉค๋ฒ์ชฝ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ ๊ณต
๊ฐ ํ์ ์ ์ํ ์ด๋์ ๋ผ์ด์ ์์
- ์ด๋์ ๋ผ์ด์ ์์: ์ด๋์ ๋ผ์ด์ ์์ ๋ค๋ฅธ ์ด๋์ ๋ผ์ด์ ๋ฅผ ํธ์ถ
- ๊ฐ ํ์
(struct, enum)๊ณผ ํด๋์ค ํ์
(class)๊ฐ ์ด๋์
๋ผ์ด์ ์์ ๋์ ๋ค๋ฆ
- ๊ฐ ํ์ ์ ์์์ ์ง์ํ์ง ์์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์๊ธฐ ์์ ์ ๋ค๋ฅธ ์ด๋์ ๋ผ์ด์ ์๋ง ์ฌ์ฉ
- ํด๋์ค ํ์ ์ ์์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ superclass์ ์ด๋์ ๋ผ์ด์ ๋ฅผ subclass์์ ํธ์ถ ๊ฐ๋ฅ
- ์์ ๋ฐ์ ๋ชจ๋ ํ๋กํผํฐ์ ์ด๊ธฐํ๋ ์ฑ ์์ ์ด๋์ ๋ผ์ด์ ์ ์์
- ์ปค์คํ
์ด๋์
๋ผ์ด์ ์ ์ธ์ ๊ธฐ๋ณธ ์ด๋์
๋ผ์ด์ ํน์ ๋ฉค๋ฒ์ชฝ ์ด๋์
๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ ์ ์์
- ์์ ์ ์ฝ์ผ๋ก ์ด๋์ ๋ผ์ด์ ์ ๋ณต์ก์ฑ์ ๋ฎ์ถ๊ณ ์ด๋์ ๋ผ์ด์ ๊ฐ ์๋ํ์ง ์๊ฒ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์ง
NOTE
์ปค์คํ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ธฐ๋ณธ ์ด๋์ ๋ผ์ด์ ์ ๋งด๋ฒ์ชฝ ์ด๋์ ๋ผ์ด์ ๋ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ปค์คํ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ค๋ฆฌ์ง๋ ํด๋์ค์์ ๊ตฌํํ์ง ์๊ณ ์ต์คํ ์ (extension)์์ ๊ตฌํ
struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
ํด๋์ค ์์๊ณผ ์ด๊ธฐํ
๋ชจ๋ ํด๋์ค์ ์ ์ฅ ํ๋กํผํฐ์ superclass๋ก๋ถํฐ ์์๋ฐ์ ๋ชจ๋ ํ๋กํผํฐ๋ ์ด๊ธฐํ ๋จ๊ณ์์ ๋ฐ๋์ ์ด๊ธฐ๊ฐ ํ ๋น (Swift์์๋ ํด๋์ค ํ์ ์์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ ์ด๊ธฐ ๊ฐ์ ๊ฐ๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด 2๊ฐ์ง ๋ฐฉ๋ฒ ์ง์)
์ง์ ์ด๊ธฐ์์ ํธ๋ฆฌํ ์ด๊ธฐ์
- ์ง์ ์ด๊ธฐ์: ํด๋์ค์ ์ฃผ ์ด๊ธฐ์
- ํด๋์ค์ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ, ํด๋์ค ํ์ ์ ๋ฐ๋์ ํ๊ฐ ์ด์์ ์ง์ ์ด๊ธฐ์ ์กด์ฌํ์
- ํธ๋ฆฌํ ์ด๊ธฐ์: ์ด๊ธฐํ ๋จ๊ณ์์ ๋ฏธ๋ฆฌ ์ง์ ๋ ๊ฐ์ ์ฌ์ฉํด ์ต์ํ์ ์
๋ ฅ์ผ๋ก ์ด๊ธฐํํ ์ ์๋๋ก ํ๋ ์ด๊ธฐ์
- ํธ๋ฆฌํ ์ด๊ธฐ์ ๋ด์์ ๋ฐ๋์ ์ง์ ์ด๊ธฐ์๊ฐ ํธ์ถ
์ง์ ์ด๊ธฐ์์ ํธ๋ฆฌํ ์ด๊ธฐ์์ ๋ฌธ๋ฒ
//์ง์ ์ด๊ธฐ์ ๋ฌธ๋ฒ
init(parameters) {
statements
}
//ํธ๋ฆฌํ ์ด๊ธฐ์ ๋ฌธ๋ฒ
convenience init(parameters) {
statements
}
์๋ ์ด๊ธฐ์ ์ธ์คํด์ค
์ด๊ธฐํ ๊ณผ์ ์ค์ ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ด๊ธฐ์๋ฅผ init๋ค์ ๋ฌผ์ํ(?)๋ฅผ ์ฌ์ฉํด ์คํจ๊ฐ ๊ฐ๋ฅํ ์ด๊ธฐ์๋ผ๊ณ ํ์
NOTE
์ด๊ธฐ์๋ ์ด๋ฆ์ด ๋ฐ๋ก ์๋ ๊ฒ์ด ์๋๋ผ ํ๋ผ๋ฏธํฐ๋ก ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ ์คํจ ๊ฐ๋ฅํ ์ด๊ธฐ์์ ์คํจ ๋ถ๊ฐ๋ฅํ ์ด๊ธฐ์๋ฅผ ๊ฐ์ ํ๋ผ๋ฏธํฐ ํ์ ๊ณผ ์ด๋ฆ์ผ๋ก ๋์์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
์คํจ ๊ฐ๋ฅํ ์ด๊ธฐ์๋ ๋ฐํ๊ฐ์ผ๋ก ์ต์ ๋ ๊ฐ์ ์์ฑ (์ด๊ธฐํ์ ์คํจํ๋ ๋ถ๋ถ์์ nil์ ๋ฐํํ๋ ์ฝ๋๋ฅผ ์์ฑํด ์ด๊ธฐํ๊ฐ ์คํจํ๋ค๋ ๊ฒ์ ๋ํ๋ผ ์ ์์)
NOTE
์๋ฐํ ๋งํ๋ฉด ์ด๊ธฐ์ init์ ๊ฐ์ ๋ฐํํ์ง ์์. ๋น๋ก nil์ ๋ฐํํ๋ return nil ์ฝ๋์๋ ์ฌ์ฉํ์ง๋ง init์ด ์ฑ๊ณตํ๋ ๊ฒฝ์ฐ return ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์์
ํ์ ์ด๊ธฐ์
- ๋ชจ๋ ์๋ธํด๋์ค์์ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ์ด๊ธฐ์, required ํค์๋ ๋ถ์
- ํ์์ด๊ธฐ์๋ฅผ ์์๋ฐ์ ์๋ธํด๋์ค์์๋ ๋ฐ๋์ required ํค์๋๋ฅผ ๋ถ์ฌ์ ๋ค๋ฅธ ์๋ธํด๋์ค์๊ฒ๋ ์ด ์ด๊ธฐ์๋ ํ์ ์ด๊ธฐ์๋ผ๋ ๊ฒ์ ์๋ ค์ผ ํจ
ํด๋ก์ ๋ ํจ์๋ฅผ ์ด์ฉํด ๊ธฐ๋ณธ ํ๋กํผํฐ ๊ฐ ์ค์ ํ๊ธฐ
๊ธฐ๋ณธ ๊ฐ ์ค์ ์ด ๋จ์ํ ๊ฐ์ ํ ๋นํ๋ ๊ฒ์ด ์๋๋ผ ๋ค์ ๋ณต์กํ ๊ณ์ฐ์ ํ์ํ๋ค๋ฉด ํด๋ก์ ๋ ํจ์๋ฅผ ์ด์ฉํด ๊ฐ์ ์ด๊ธฐํ ํ๋๋ฐ ์ด์ฉํ ์ ์์
์ด๊ธฐํ ํด์ง (Deinitialization)
์์ฑ์์ ๋ฐ๋๋ก ํด๋์ค ์ธ์คํด์ค๊ฐ ์๋ฉธ๋๊ธฐ ์ง์ ์ ํธ์ถ
deinit {
// perform the deinitialization**
}
- ํด๋์ค๋น ์ค์ง ํ๋๋ง ์ ์ธํ ์ ์๊ณ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์ ์์
- ์๋ฉธ์๋ ์๋์ผ๋ก ํธ์ถ๋๊ณ ์๋์ผ๋ก ํธ์ถํ ์ ์์
- Superclass์ ์๋ฉธ์๋ Subclass์์ ์๋ฉธ์๋ฅผ ์ ์ธํ์ง ์์๋ ์๋์ผ๋ก ํธ์ถ๋จ
์ด๊ธฐํ์ ์ฌ์ฉ
class Bank {
static var coinsInBank = 10_000
static func distribute(coins numberOfCoinsRequested: Int) -> Int {
let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
coinsInBank -= numberOfCoinsToVend
return numberOfCoinsToVend
}
static func receive(coins: Int) {
coinsInBank += coins
}
}
class Player {
var coinsInPurse: Int
init(coins: Int) {
coinsInPurse = Bank.distribute(coins: coins)
}
func win(coins: Int) {
coinsInPurse += Bank.distribute(coins: coins)
}
deinit {
Bank.receive(coins: coinsInPurse)
}
}
var playerOne: Player? = Player(coins: 100)
print("A new player has joined the game with \\(playerOne!.coinsInPurse) coins")
// Prints "A new player has joined the game with 100 coins"
// ์ฌ์ฉ์๋ 100 ์ฝ์ธ์ ๊ฐ๊ณ ์์ํฉ๋๋ค.
print("There are now \\(Bank.coinsInBank) coins left in the bank")
// Prints "There are now 9900 coins left in the bank"
// ํ ์์ ์ ์ํ์ 9900์ ์ฝ์ธ์ ์์ ํ๊ณ ์์ต๋๋ค.
playerOne!.win(coins: 2_000)
print("PlayerOne won 2000 coins & now has \\(playerOne!.coinsInPurse) coins")
// Prints "PlayerOne won 2000 coins & now has 2100 coins"
// ์ฌ์ฉ์๊ฐ ๊ฒ์์ ์ด๊ฒจ 2000์ฝ์ธ์ ๋ฐ์ ์ฒ์์ ๊ฐ๊ณ ์๋ 100 ์ฝ์ธ๊ณผ ๋๋ถ์ด ํ์ฌ ์ด 2100 ์ฝ์ธ์ ์์ ํ๊ฒ ๋ฉ๋๋ค.
print("The bank now only has \\(Bank.coinsInBank) coins left")
// Prints "The bank now only has 7900 coins left"
// ์ฌ์ฉ์์๊ฒ 2100 ์ฝ์ธ์ ๋๋ ์ค ์ํ์๋ ํ์ฌ 7900 ์ฝ์ธ์ด ๋จ์์ต๋๋ค.
playerOne = nil
print("PlayerOne has left the game")
// Prints "PlayerOne has left the game"
// ์ฌ์ฉ์๊ฐ ๊ฒ์์์ ๋๊ฐ์ต๋๋ค.
print("The bank now has \\(Bank.coinsInBank) coins")
// Prints "The bank now has 10000 coins"