Apple 제공 Swift 프로그래밍 가이드(3.0.1)의 Deinitialization 부분을 공부하며 정리한 글입니다. 개인적인 생각도 조금 들어가있습니다.
들어가며
디이니셜라이저deinitializer는 클래스 인스턴스가 할당해제deallocated되기 바로 직전에 불린다. deinit 키워드로 정의할 수 있으며 클래스 타입에서만 사용할 수 있다.
How Deinitialization Works
Swift는 ARC(automatic reference counting)을 통해 메모리를 관리하면서 더 이상 필요하지 않다고 여겨지는 인스턴스를 자동으로 할당해제deallocate 해준다. 따라서 인스턴스가 할당해제될 때 자원 정리를 개발자가 직접 할 일은 별로 없다. 그러나 신경을 써야 할 상황도 있기 마련이다. 예를 들어 파일을 열어서 거기에 데이터를 쓰는 커스텀 클래스를 만들었다고 해보자. 이 경우 클래스의 인스턴스가 할당해제될 때 파일을 닫아주는 작업이 필요하다. 이럴 때 디이니셜라이저를 사용한다.
deinit {
// perform the deinitialization
// (ex) 파일 닫아주기
}
클래스는 디이셜라이저를 최대 1개만 가질 수 있다
파라미터는 정의할 수 없으며, 정의할 때 괄호는 필요없다
인스턴스가 할당해제되기 바로 직전에 자동으로 호출된다
직접적으로 호출할 수 없다
슈퍼클래스의 디이니셜라이저는 서브클래스에게 상속된다. 서브클래스의 디이니셜라이저가 끝난 다음 슈퍼클래스의 디이니셜라이저가 불린다. (서브클래스가 디이니셜라이저를 따로 정의하지 않아도 불린다)
디이니셜라이저가 불리는 시점에서 인스턴스는 아직 할당해제 되지 않았다. 따라서 인스턴스의 프로퍼티에 접근하는 것이 가능하다.
디이니셜라이저 실제로 써보기
Bank 클래스 : 은행. 하나만 존재함.
Player 클래스 : 초기화 될 때 은행에서 자산을 받음. 할당해제 될 때는 은행에 자산을 전부 환원해야 함.
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"
print("There are now \(Bank.coinsInBank) coins left in the bank")
// Prints "There are now 9900 coins left in the bank"
playerOne!.win(coins: 2_000)
print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
// Prints "PlayerOne won 2000 coins & now has 2100 coins"
print("The bank now only has \(Bank.coinsInBank) coins left")
// Prints "The bank now only has 7900 coins left"
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"
'Swift 공식 가이드 > Swift 3' 카테고리의 다른 글
Optional Chaining (0) | 2017.03.18 |
---|---|
Automatic Reference Counting (ARC) (1) | 2017.03.14 |
Initialization (3/3) (0) | 2017.03.13 |
Initialization (2/3) (0) | 2017.03.13 |
Initialization (1/3) (0) | 2017.03.12 |