[Swift] TypeCasting

Inwoo Hwang·2021년 8월 26일
0

Swift

목록 보기
5/8
post-thumbnail

타입 캐스팅


import UIKit

class Coffee {
    let name: String
    let shot: Int
    let price: Int
    
    var description: String {
        return "\(name) \(shot)샷 나왔습니다. \(price)원 입니다."
    }
    init(name: String, shot: Int, price: Int) {
        self.name = "cofee"
        self.shot = shot
        self.price = price
    }
}

class Americano: Coffee {
    var 원두타입: String
    
    override var description: String {
        return "\(원두타입) 아메리카노 \(shot)샷 나왔습니다. \(price)원 입니다."
    }
    
    init(원두타입: String, shot: Int, price: Int) {
        self.원두타입 = 원두타입
        super.init(name: "아메리카노", shot: shot, price: price)
    }
}

class Latte: Coffee {
    var 우유: String
    var 설탕: String
    
    override var description: String {
        return "\(설탕) 라떼 \(shot)샷 나왔습니다. \(price)원 입니다."
    }
    
    init(우유: String, 설탕: String, shot: Int, price: Int) {
        self.우유 = 우유
        self.설탕 = 설탕
        super.init(name: "라떼", shot: shot, price: price)
    }
}

// 어떤 클래스타입의 변수 또는 상수가 정말로 해당 클래스의 인스턴스를 참조하지 않을 수도 있습니다. 예를들어 Latte 클래스의 인스턴스가 Coffee 클래스의 인스턴스인양 Coffee 행세를 할 수 있습니다.
// 라떼는 아니지만 라떼 행세를하면 라떼의 프로퍼티 또는 메서드를 가져와서 사용할 수 있습니다.

// 타입캐스팅은 실제로 인스턴스를 수정하거나 값을 변경하는 작업이 아닙니다. 인스턴스는 메모리에 똑같이 남아있을 뿐 입니다 다만 인스턴스를 사용할 때 어떤 타입으로 다루고 어떤 타입으로 접근해야 할지 판단할 수 있도록 컴퓨터에 힌트를 주는 것뿐 입니다. [출처]: 야곰책

let 다방커피: Coffee = Latte(우유: "메일우유", 설탕: "백설탕", shot: 2, price: 3000)

// 다운 캐스팅을 할 때는 타입캐스트 연산자 as?, as!를 사용해요

let 찐커피 = Coffee(name: "맛 없는 커피", shot: 1, price: 800)
if let 라떼행세를하는그냥커피: Latte = 찐커피 as? Latte {
    라떼행세를하는그냥커피.설탕
    라떼행세를하는그냥커피.우유
}

let 찐라떼 = Latte(우유: "그냥우유", 설탕: "3스푼", shot: 2, price: 300)
if let 아메리카노행세를하는그냥커피: Americano = 찐커피 as? Americano {
    아메리카노행세를하는그냥커피.원두타입
}

if let 아메리카노행세를하는라떼: Americano = 찐라떼 as? Americano {
    // Cast from 'Latte' to unrelated type 'Americano' always fails
    // 자식간의 타입 캐스팅은 두 타입이 서로 관련이 없기 때문에 언제나 실패한다.
}

struct 커피머신 {
    var coffee: Coffee
}

// 스타벅스에는 메뉴가 6개인데 각 각 메뉴의 메서드를 만들지 않고 Coffee라는 타입을 통해 여러커피를 만들 수 있다. 다형성의 매직
let 써니의커피머신 = 커피머신(coffee: Latte(우유: "오늘우유", 설탕: "서얼탕", shot: 3, price: 8000))
let 제임스의커피머신 = 커피머신(coffee: Americano(원두타입: "쿠바", shot: 3, price: 10000))
profile
james, the enthusiastic developer

0개의 댓글