Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

초기화 해제 #51

Open
simoniful opened this issue Oct 29, 2022 · 0 comments
Open

초기화 해제 #51

simoniful opened this issue Oct 29, 2022 · 0 comments

Comments

@simoniful
Copy link
Owner

simoniful commented Oct 29, 2022

디이니셜라이저는 클래스 인스턴스가 소멸되기 전에 즉시 호출된다
deinit 키워드를 통해 디이니셜라이저를 사용 가능
디이니셜라이저는 클래스 타입에서만 사용 가능

디이니셜라이저의 작동 방식

Swift는 인스턴스가 더 이상 사용되지 않으면 공간을 비움으로써 자동으로 소멸시킨다
Swift는 자동 참조 카운팅(ARC, Automatic Reference Counting)을 통해 인스턴스의 메모리를 관리
일반적으로 인스턴스가 소멸될 때 수동으로 청소를 할 필요가 없다
하지만, 리소스를 사용하고 있을 때, 추가적인 청소 작업이 필요할 때가 있다
ex. 파일을 열고 데이터를 쓰기위한 커스텀 클래스를 만들면, 클래스 인스턴스가 소멸되기 전에 반드시 파일을 닫아야한다

클래스는 최대 하나의 디이니셜라이저를 가질 수 있다
디이니셜라이저는 매개 변수를 갖지 않기에 소괄호를 작성하지 않는다

deinit {
    // perform the deinitialization
}

디이니셜라이저는 인스턴스가 소멸되기 직전에 자동으로 호출된다
수동으로 직접 호출할 수는 없다
자식 클래스가 상속한 부모 클래스의 디이니셜라이저는 자식 클래스의 디이니셜라이저 구현의 끝에서 자동으로 호출
부모 클래스의 디이셜라이저는 자식 클래스에서 디이니셜라이저를 선언하지 않아도 항상 실행

디이니셜라이저가 호출된 이후에야 인스턴스가 소멸되기 때문에
디이니셜라이저는 인스턴스의 모든 프로퍼티에 접근할 수 있고,
프로퍼티에 기반하여 행동을 수정할 수도 있다

디이니셜라이저의 사용

Bank 클래스는 은행 coinsInBank 프로퍼티로 함께 현재 보유하고 있는 코인의 수를 추적하고 총 보유 코인의 양을 10000으로 한정
또한, 코인의 유통과 수집을 처리하기 위해 distribute(coins:) 와 receive(coins:)의 두 가지 매서드를 제공
Bank는 오직 하나만 존재할 수 있기 때문에, 타입 프로퍼티와 타입 메소드로 내부를 구현

Player 클래스는 게임에서 플레이어를 묘사
각 플레이어는 언제든지 coinsInPurse에 일정 수의 코인을 보관 가능
각 초기화 시점에서 그들의 지갑에 저장된 코인의 양을 소유하게 되고, 플레이어의 소유의 코인으로 표현
또한, win(coin:) 메서드와 디이니셜라이저를 제공

// Bank와 Player 두 가지 클래스를 정의
// Bank 클래스는 통화를 관리하며, 10000 코인 이상 보유할 수 없다
class Bank {
    static var coinsInBank = 10_000

    // The distribute(coins:) 매서드는 코인이 유통되기 전에 은행에 충분한지 확인
    // 코인이 충분하지 않으면 은행은 요청된 숫자보다 작은 숫자를 반환 - 은행에 코인이 남아 있지 않으면 0을 반환
    // 제공된 실제 코인 수를 나타내는 정수 값을 반환
    static func distribute(coins numberOfCoinsRequested: Int) -> Int {
        let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
        coinsInBank -= numberOfCoinsToVend
        return numberOfCoinsToVend
    }
 
    // The receive(coins:) 매서드는 단순히 받은 코인 수를 은행의 코인 스토어에 다시 추가
    static func receive(coins: Int) {
        coinsInBank += coins
    }
}

// Player 클래스는 게임에서의 플레이어를 묘사
// 사용 가능한 코인이 충분하지 않은 경우 플레이어 인스턴스는 해당 개수보다 적은 개수의 코인을 받을 수 있다
// 은행에서 일정 수의 코인을 검색하여 플레이어의 지갑에 추가하는 win(coin:) 메서드를 정의
// 디이니셜라이저는 플레이어가 가진 모든 코인을 은행에 돌려 준다
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)
    }
}

// 100개의 코인을 가진 플레이어 인스턴스 생성 playerOne에 할당
// 플레이어는 언제든지 게임을 떠날 수 있기 때문에 옵셔널 변수가 여기에 사용
// 현재 게임에 플레이어가 있는지 여부를 추적 가능, nil일 경우 게임을 떠난 것
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이 2000 코인을 획득
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을 할당하면, Player 인스턴스에 대한 참조는 끊어진다
// 메모리에서 비워져 소멸되기 전에 디이니셜라이저가 호출되어 은행에 돈을 돌려 주게 된다
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"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant