[Swift] 타입캐스팅

선주·2022년 4월 11일
0

Swift

목록 보기
10/20

📌 타입캐스팅

Swift의 타입캐스팅은 인스턴스의 타입을 확인하는 용도, 또는 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도로 사용한다. is, as를 사용한다.

class Person {
    var name: String = ""
    func breath() {
        print("숨을 쉽니다")
    }
}

class Student: Person {
    var school: String = ""
    func goToSchool() {
        print("등교를 합니다")
    }
}

class UniversityStudent: Student {
    var major: String = ""
    func goToMT() {
        print("멤버쉽 트레이닝을 갑니다 신남!")
    }
}

// 인스턴스 생성
var yagom: Person = Person()
var hana: Student = Student()
var jason: UniversityStudent = UniversityStudent()

var result: Bool

result = yagom is Person // true
result = yagom is Student // false
result = yagom is UniversityStudent // false

result = hana is Person // true
result = hana is Student // true
result = hana is UniversityStudent // false

result = jason is Person // true
result = jason is Student // true
result = jason is UniversityStudent // true

hana는 Person을 상속받으므로 Person과 Student에서 모두 true가 뜨고, jason은 Student를 상속받으므로 Person, Student, UniversityStudent에서 모두 true가 뜬다.


📌 업캐스팅

as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해준다.

쉽게 말해, 대학생이 사람 행세 할 수 있느냐? -> ㅇㅋ

// UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 업 캐스팅
var mike: Person = UniversityStudent() as Person

var jenny: Student = Student()
//var jina: UniversityStudent = Person() as UniversityStudent // 컴파일 오류

// UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 업 캐스팅
var jina: Any = Person() // as Any 생략가능

📌 다운캐스팅

as?또는 as!를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해준다.

사람 타입으로 지정돼있는데 얘가 실제로는 학생일 수 있는가? -> ㅇㅇ

조건부 다운캐스팅

as?를 사용한다. 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 nil을 반환하기 때문에 결과의 타입은 옵셔널 타입이다.

var optionalCasted: Student?

optionalCasted = mike as? UniversityStudent
optionalCasted = jenny as? UniversityStudent // nil
optionalCasted = jina as? UniversityStudent // nil
optionalCasted = jina as? Student // nil

mike는 실질적으로 할당된 인스턴스가 대학생이었으므로, 사람 타입으로 할당되어있어도 대학생으로 캐스팅될 수 있다. 하지만 다른 사람들은 사람이거나 학생이었으므로 대학생으로 캐스팅될 수 없어서 nil을 반환한다.

강제 다운캐스팅

as!를 사용한다. 캐스팅에 실패하면, 즉 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 런타임 오류가 발생한다. 캐스팅에 성공하면 옵셔널이 아닌 일반 타입을 반환한다.

var forcedCasted: Student

forcedCasted = mike as! UniversityStudent
//forcedCasted = jenny as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! Student // 런타임 오류

활용

func doSomething(someone: Person) {
    if let universityStudent = someone as? UniversityStudent {
        universityStudent.goToMT()
    } else if let student = someone as? Student {
        student.goToSchool()
    } else if let person = someone as? Person {
        person.breath()
    }
}

doSomething(someone: mike as Person) // 멤버쉽 트레이닝을 갑니다 신남!
doSomething(someone: mike) // 멤버쉽 트레이닝을 갑니다 신남!
doSomething(someone: jenny) // 등교를 합니다
doSomething(someone: yagom) // 숨을 쉽니다


야곰의 스위프트 기본 문법 강좌를 수강하며 작성한 내용입니다.

profile
기록하는 개발자 👀

0개의 댓글