티스토리 뷰

Swift 공식 가이드/Swift 3

Deinitialization

찜토끼 2017. 3. 13. 20:27

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함