Swift - 초기화 해지

임성빈·2022년 4월 5일
0

Swift

목록 보기
15/26
post-thumbnail
post-custom-banner

초기화 해지


Deinitializer는 초기자와 반대로 클래스 인스턴스가 소멸되기 직전에 호출된다. 초기자는 선언 키워드로 init 을 사용하는 Deinitializer는 선언을 위해 deinit 키워드를 사용한다. Deinitializer는 오직 클래스 타입에서만 사용 가능하다.


초기화 해지의 동작

일반적으로 Swift가 자원의 해제를 자동으로 알아서 해주는데, 열었던 파일을 사용이 끝나고 닫는 것 같이 사용자가 자원 해지를 위해 수동으로 작업해야하는 경우도 있다. 이럴 때 사용하는 것이 Deinitializer이다. Deinitializer는 하나의 클래스에 오직 하나만 선언할 수 있고 파라미터를 받을 수 없다. Deinitializer의 기본적인 선언 형태는 다음과 같다.

deinit {
	// perform the Deinitialization
}

Deinitializer는 자동으로 호출되고 수동으로 호출할 수 없다. Superclass의 Deinitializer는 Subclass에서 따로 선언하지 않아도 자동으로 호출된다.


Deinitializer의 사용

Deinitializer의 동작 확인을 위한 예제 코드이다.

class Bank {
	static var coinsInBank = 10_000
    static func distribute(coins numberOfCoinsRequested: Int) -> Int {
    	let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
        coinsInBank -= numberOfCoinsRequested
        return numberOfCoinsToVend
    }
    static func receive(coins: Int) {
    	coinsInBank += coins
    }
}

Bank 클래스를 하나 선언하고 Bank 가 소유한 코인의 수 coinsInBank 와 코인을 배포하는 distribute 메소드와 코인을 받는 receive 메소드를 선언한다. distribute 메소드에서는 numberOfCoinsRequestedcoinsInBank 를 비교해 더 작은 것을 반환한다. receive 메소드는 코인을 받아 Bank 에 추가하는 메소드이다. 이 코인을 활용해 게임을 한다고 가정해 보자. 사용자는 게임을 하는데 처음에 일정 코인을 Bank 로부터 받고 시작하고, 게임에서 이길 때마다 Bank 에서 코인을 받아 사용자의 지갑에 저장한다.

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: coinInPurse)
    }
}

게임이 끝나면 Bank 에서 받았던 코인을 다시 Bank 로 돌여주기 위해 위 코드에서 deinit 안에 Bank.receive(coins: coinInPurse) 코드를 넣어 사용했던 코인은 모두 Bank 에 다시 반환하도록 한다.

var playerOne: Player? = Player(coins: 100)
print("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
// 사용자는 100 코인을 갖고 시작.
print("There are now \(Bank.coinsInBank) coins left in the bank")
// 현 시점에 은행은 9900의 코인을 보유.

사용자가 게임에서 이겨 2000 코인을 받게 될 경우

playerOne!.win(coins: 2_000)
print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
// 사용자가 게임에 이겨 2000코인을 받아 
// 처음에 갖고 있던 100 코인과 더불어 현재 총 2100 코인을 보유.
print("The bank now only has \(Bank.coinsInBank) 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"

playerOne = nil 이라는 것은 더이상 이 인스턴스를 사용하지 않는다는 것을 의미한다. 그래서 앞의 Deinitializer가 실행되어 deinit 안에서 선언한 Bank.receive(coins: coinInPurse) 코드가 실행돼 Bank 는 다시 처음에 갖고 있던 10000 코인을 갖게 된다.

profile
iOS 앱개발
post-custom-banner

0개의 댓글