[Swift 5/부스트 코스] iOS 프로그래밍을 위한 스위프트 기초 - 타입 캐스트 as (1-24) 정리, 생각해보기
안녕하세요. 개발하는 정주입니다.
오늘은 타입 캐스트에 대해 포스팅하려고 합니다.
부스트 코스 1-24 타입 캐스트 내용입니다. 생각해보기 내용은 맨 아래에 있습니다.
http://www.boostcourse.org/mo122/lecture/11312
as
as는 업 캐스팅과 다운 캐스팅에 사용되는 연산자입니다.
업 캐스팅
Sub class instance를 Super Class Type으로 참조합니다. 컴파일 시점에 캐스팅 가능 여부를 판단합니다.
// UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 업 캐스팅
var mike: Person = UniversityStudent() as Person
업 캐스팅은 항상 성공하기 때문에 as만 써도 되고 직접 타입 명시를 해도 괜찮습니다.
항상 성공하는 이유는 상속에 대해 알면 이해가 쉽습니다.
상속에서 Super class의 멤버는 Sub class가 당연히 포함하고 있기 때문입니다.
다운 캐스팅
Super Class Instance를 Sub class Type으로 참조합니다. 다운 캐스팅은 실패할 가능성이 있기 때문에 ?나 !를 이용해야 합니다.
조건부 다운 캐스팅
var optionalCasted: Student?
optionalCasted = mike as? UniversityStudent
optionalCasted = jenny as? UniversityStudent // nil
optionalCasted = jina as? UniversityStudent // nil
optionalCasted = jina as? Student // nil
캐스팅에 실패하면 nil을 반환합니다. 캐스팅에 성공하면 옵셔널 타입을 반환합니다.
강제 다운 캐스팅
var forcedCasted: Student
forcedCasted = mike as! UniversityStudent
//forcedCasted = jenny as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! Student // 런타임 오류
캐스팅에 실패하면 런타임 에러가 발생합니다. 캐스팅에 성공하면 일반 타입을 반환합니다.
생각해보기
as는 실제로 대상 객체의 타입을 변경시키는 걸까요? 결론은 아닙니다.
class Person {
final var name: String = ""
func breath() {
print("후하후하")
}
}
class Student: Person {
var school: String = ""
func goToSchool() {
print("등교하기")
}
}
class UniversityStudent: Student {
final var major:String = ""
func goToMT() {
print("MT 가자")
}
}
위와 같이 예시 클래스를 만들었습니다.
var jeong = UniversityStudent()
var ju = UniversityStudent() as Student
이 코드의 실행 값은 어떨까요? UniversityStudent와 Student로 나온다고 잘못 생각할 수 있습니다.
실제로 코드를 실행해보면 두 개 모두 UniversityStudent로 나온다는 사실을 알 수 있습니다.
그렇다면 ju는 UniversityStudent이니 goToMT()를 호출할 수 있을까요?
그것도 아닙니다. Student의 goToSchool()까지 밖에 참조가 되지 않는 것을 알 수 있습니다.
즉, instance는 UniversityStudent로 생성이 되지만 참조 범위는 Student 멤버로 제한된다라는 것입니다.
따라서 이번 생각해보기는 아니다!입니다.
마무리 잡담
간단한 연산자이지만 내부는 꽤나 복잡하게 되어 있네요. 이번 기회에 깊게 알아보게 된 계기가 되었습니다.
감사합니다!
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.