본문 바로가기
⌨️ Language/swift

[Swift] 타입 캐스팅

by hyebin (Helia) 2023. 2. 6.

타입 캐스팅 (Type Casting)

  • 인스턴스의 "타입"을 확인하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급하는 방법
  • Swift에서 타입 캐스팅은 "is"나 "as" 연산자로 구현
  • 타입 캐스팅을 사용하여 타입이 프로토콜에 적합한지 여부도 확인 가능

is

  • 타입을 체크하는 연산자
  • 런타임 시점에 실제 체크가 이루어짐
  • 반환 값은 Bool 형
  • 표현식이 Type과 동일하거나, 표현식이 Type의 서브클래스인 경우 True를 반환
  • 이 외에는 False 반환
//1
let char: Character = "A"
 
char is Character       // true
char is String          // false

//2
class Animal { }
class Dog: Animal { }
 
let dog: Dog = .init()
dog is Dog      // true
dog is Animal        // true

1. 동일한 타입을 확인할 때 사용

2. Animal 클래스를 Dog란 클래스가 "상속" 받을 경우, dog 인스턴스는 Animal 클래스의 서브 클래스이기 때문에 true 반환

as

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

 

업캐스팅 (Upcasting) 

  • 서브 클래스 인스턴스를 "슈퍼 클래스의 타입"으로 참조
  • 업캐스팅은 항상 성공
  • as 연산자를 사용 (컴파일 시점에 캐스팅 가능 여부를 결정)
  • as  : "컴파일 시점"에 타입 캐스팅(업캐스팅)을 하며, 실패할 경우 에러가 발생 패턴 매칭(switch)에도 사용
class Animal {
    let name: String = "Pobi"
}
class Dog: Animal {
    let color: String = "White"
}

// 1. as를 사용한 업캐스팅
let animal1 = Dog.init() as Animal
animal1.name	//Pobi
animal1.color	// Value of type 'Animal' has no member 'color'

// 2. Type Annotation을 사용한 업캐스팅
let animal2: Animal = Dog.init()

Dog 타입의 인스턴스를 생성하지만, 이를 Animal 타입으로 업캐스팅해서 animal에 저장

animal이 Dog란 서브 클래스를, Animal이란 슈퍼클래스 타입으로 참조하는"업캐스팅"을 한 것이기 때문에, animal의 접근 범위가 "Animal" 멤버로 한정되는 것 

따라서 Animal 클래스의 멤버인 name엔 접근할 수 있지만, 서브 클래스 Dog의 멤버인 color에는 접근할 수 없음

 

다운캐스팅 (Downcasting) 

  • 슈퍼 클래스 인스턴스를 "서브 클래스의 타입"으로 참조
  • 업캐스팅된 인스턴스를 다시 원래 서브 클래스 타입으로 참조할 때 사용
  • 다운 캐스팅은 실패할 수 있기 때문에 as? 또는 as! 연산자 사용
  • as?  : "런타임 시점"에 타입 캐스팅(다운 캐스팅)을 하며, 실패할 경우 nil을 리턴
  •  as!  : "런타임 시점"에 타입 캐스팅(다운 캐스팅)을 하며, 실패할 경우 에러 발생
class Animal {
    let name: String = "Pobi"
}
class Dog: Animal {
    let color: String = "White"
}

let animal = Dog.init() as Animal

var dog: Dog = animal as! Dog
dog.name    //Pobi
dog.color   //White

 

반응형

'⌨️ Language > swift' 카테고리의 다른 글

[Swift] 프로토콜 (Protocol)  (0) 2023.02.06
[Swift] assert와 guard  (0) 2023.02.06
[Swift] 클래스(Class)와 구조체(Struct)  (0) 2023.02.06
[Swift] 옵셔널 (Optional)  (0) 2023.02.06
[Swift] 열거형 (Enumerations)  (0) 2022.02.08

댓글