Swift - is, as - 타입 캐스팅

이원석·2024년 11월 27일

Swift

목록 보기
23/38

Type Casting

타입 캐스팅은 인스턴스의 Type을 확인 하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급하는 방법이다.
Swift에서 타입 캐스팅은 isas연산자로 구현하며, 타입 캐스팅을 사용하여 타입이 프로토콜에 적합한지 여부도 확인할 수 있다.

is: Checking Type

표현식 is Type

타입을 체크하는 연산자로, 런타임 시점에 실제 체크가 이루어 진다.
표현식이 Type과 동일하거나, 표현식이 Type의 서브 클래스인 경우 true 이 외의 경우엔 false를 반환한다.

let char: Character = "A"
 
char is Character       // true
char is String          // false
 
 
let bool: Bool = true
 
bool is Bool            // true
bool is Character       // false

class Human { }
class Teacher: Human { }
 
let teacher: Teacher = .init()
teacher is Teacher      // true
teacher is Human        // true

as: Type Casting

표현식 as  (변환 할)Type
표현식 as? (변환 할)Type
표현식 as! (변환 할)Type

표현식(의 타입)이 변환할 Type과 호환된다면, 변환할 Type으로 캐스팅된 인스턴스를 리턴한다. 상속관계인 업캐스팅(Upcasting)과 다운 캐스팅(Downcasting)에서 사용한다.
Any와 AnyObject 타입을 사용할 경우, 상속 관계가 아니어도 예외적으로 사용할 수 있다.

업캐스팅과 다운 캐스팅

1. 업캐스팅(Upcasting)
서브 클래스 인스턴스를 슈퍼 클래스의 타입으로 참조한다.
업 캐스팅은 항상 성공한다.
as 연산자를 사용해서 할 수도 있다.(컴파일 시점에 캐스팅 가능 여부를 결정한다)

class Human {
    let name: String
    init(name: String) {
        self.name = name
    }
}
class Teacher: Human { }
class Student: Human { }
 
 //Student와 Teacher를 Human이란 클래스로 업캐스팅 해서 묶음.
let people: [Human] = [
    Teacher.init(name: "김선생"),
    Student.init(name: "박제자"),
    Student.init(name: "유제자")
]
//as 를 통한 업캐스팅
let human = Teacher.init() as Human

2. 다운캐스팅(Downcasting)
슈퍼 클래스 인스턴스를 서브 클래스의 타입으로 참조한다.
업캐스팅된 인스턴스를 다시 원래 서브 클래스 타입으로 참조할 때 사용한다.
다운 캐스팅은 실패할 수 있기에 as?,as! 연산자를 사용한다.

  • 업캐스팅한 인스턴스에서는 서브 클래스의 멤버에 접근할 수 없음 -> 다운캐스팅 이용
let human = Teacher.init() as Human // 업캐스팅
var teacher: Teacher = human as! Teacher // 다운캐스팅
  • as? : 런타임 시점에서 타입 캐스팅(다운캐스팅)을 하며, 실패할 경우 nil 리턴
var teacher: Teacher = human as? Student // nil
  • as! : 런타임 시점에서 타입 캐스팅(다운캐스팅)을 하며, 실패할 경우 에러 발생

참조
개발자 소들이

0개의 댓글