iOS/Swift

[Swift] 타입 캐스팅(Type Casting), 업 캐스팅(Up Casting), 다운 캐스팅(Down Casting)

겸둥이xz 2021. 4. 9. 02:38
반응형

 

스위프트 타입 캐스팅

  • 인스턴스의 타입을 확인하는 용도로 쓰입니다.
  • 클래스의 인스턴스를 부모(Up) 혹은 자식(Down) 클래스의 타입으로 사용할 수 있는지 확인하는 용도
  • 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 goToLib() {
        print("도서관을 갑니다..")
    }
}

// 인스턴스 생성
var james: Person = Person()
var hana: Student = Student()
var joe: UniversityStudent = UniversityStudent()

 

is를 이용한 타입확인

var result: Bool

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

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

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

// if
if james is UniversityStudent {
    print("james는 대학생입니다.")
} else if james is Student {
    print("james는 학생입니다.")
} else if james is Person {
    print("james는 사람입니다.")
} // james는 사람입니다.

// switch, case
switch james {
case is Person:
	print("james는 사람입니다.")
case is Student:
	print("james는 학생입니다.")
case is UniversityStudent:
	print("james는 대학생입니다.")
default:
	print("james는 사람도, 학생도, 대학생도 아닙니다!")
} // james는 사람입니다.

Person is Student 사람은 학생이다.(X) - 모든 사람은 학생이 아니다.

Student is Person 학생은 사람이다.(O)

 

업 캐스팅(Up Casting)

  • as를 사용하여 부모 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줍니다.
  • Any 혹은 AnyObject로도 타입정보를 변환할 수 있습니다.
  • 암시적으로 처리되므로 꼭 필요한 경우가 아니면 생략가능합니다.
// 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 생략가능

 

다운 캐스팅(Down Casting)

  • as?(조건부) 또는 as!(강제) 를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줍니다.
var optionalCasted: Student?

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

mike는 UniversityStudent이지만, 현재 Person으로 Up Casting 되어있는 상태입니다.

    - var mike: Person = UniversityStudent() as Person

그래서 as?를 통해서 UniversityStudentDown Casting이 가능합니다.

 

2. 강제 다운 캐스팅

  • as!를 사용하고, 캐스팅에 실패하면 런타임 오류가 발생합니다. 캐스팅 성공시 일반 타입을 반환합니다.
var forcedCasted: Student

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

 

 

 

<참고자료>

www.boostcourse.org/mo122/lecture/11312?isDesc=false

반응형