타입 캐스팅

JG Ahn·2024년 11월 8일

swift 심화

목록 보기
6/18
post-thumbnail

타입 캐스팅

타입 캐스팅이란?

인스턴스의 타입을 확인하거나 특정 타입으로 변환하는 방법

  • class에서 상속 관계를 이용한 타입캐스팅이 주로 사용되며,
    struct과 enum에서는 상속을 통한 타입캐스팅을 지원하지 않음
  • is: 타입을 확인하는 키워드. 타입이 특정클래스 또는 하위클래스인경우 true를 반환하고 아니라면 false를 반환
  • 타입 변환 키워드 as, as?, as!
    • as는 슈퍼클래스로 변환하는 타입캐스팅(업캐스팅)
    • as?는 서브클래스로 변환하는 타입캐스팅(Optional 값으로 다운캐스팅)
    • as!는 서브클래스로 변환하는 타입캐스팅(실패하면 앱이 크래시 발생)

사용 방법

인스턴스 이름 뒤에 타입캐스팅의 키워드(is, as, as?, as!) 뒤에 특정 타입을 사용

[ is ]

class Animal {
    var name: String
    var age: Int
        
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

class Person: Animal {//Animal을 상속받음
    var job: String

    init(name: String, age: Int, job: String) {
        self.job = job
        super.init(name: name, age: age)
    }
}

class Car { }

//person이 자식. animal이 부모
let person = Person(name: "John", age: 30, job: "Developer")
let animal = Animal(name: "Dog", age: 5)

print(person is Person) // true : person은 Person 같은 타입이므로 true
print(person is Animal) // true : person은 Animal의 하위 타입이기 때문에 true
print(person is Car) // false : Person은 Car와 관련이 없기 때문에 false


print(animal is Person) // false : Animal은 Person의 상위 타입이므로 false
print(animal is Animal) // true : Animal은 Animal과 같은 타입이므로 true
print(animal is Car) // false : Animal은 Car와 관련이 없기 때문에 false

[ as, as?, as! ]

class Animal {
    var name: String
    var age: Int
        
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

class Person: Animal {
    var job: String?

    init(name: String, age: Int, job: String) {
        self.job = job
        super.init(name: name, age: age)
    }
}

class Car {
}

// Upcasting as
let person2 = Person(name: "Brody", age: 30, job: "Developer")
let personToAnimal = person2 as Animal // person2 To Animal로 업캐스팅 합니다
print(personToAnimal)

// Downcating as?, as!

// Person으로 인스턴스를 생성했지만 타입은 Animal로 명시했기 때문에 Animal Type
let person: Animal = Person(name: "John", age: 30, job: "Developer")
let animalToPerson = person as? Person
print(animalToPerson?.job) // Optional("Developer") 출력

let animal = Animal(name: "Dog", age: 3)
let animalToPerson2 = animal as? Person
print(animalToPerson2) // nil
// nil인 이유는 Person에 있는 job이 Animal로 생성하면 없기 때문에 다운캐스팅 실패

// animal as! Person // Crash 캐스팅 실패하여 런타임

0개의 댓글