iOS 공부하는 감자

Day13) 타입캐스팅 본문

22 베이직 챌린지

Day13) 타입캐스팅

DongTaTo 2022. 1. 15. 22:57
반응형

타입캐스팅

  • 인스턴스의 타입을 확인하거나, 해당 인스턴스의 타입을 부모 클래스나 자식 클래스로 취급하는 방법이다.
  • 타입캐스팅을 사용하여 인스턴스의 타입이 프로토콜에 적합한지 여부도 확인 가능하다.
  • is, as 키워드를 사용한다.
  • 클래스의 인스턴스에서 자주 사용한다.
  • 딕셔너리나 Any, AnyObject같은 타입을 많이 사용하면 유용하다.

 

is

  • 인스턴스 is 타입이름 // -> bool
     
  • 인스턴스의 타입을 확인하는 연산자로, 런타임 시점에 체크가 이루어진다.
  • 확인할 인스턴스가 타입의 서브 클래스(자식 클래스)를 사용한 인스턴스여도 true를 반환한다.
  • class Person {
        let name: String = ""
    }
    class Student: Person {
        var age: Int = 25
    }
    
    let dong: Student = Student()
    
    dong is Student  // true
    // 비교할 인스턴스의 부모 클래스로 is 연산을 수행해도 true 반환
    dong is Person   // true

 

 

as : 타입캐스팅

인스턴스 as 변환할 타입     // 업 캐스팅
인스턴스 as? 변환할 타입    // 다운 캐스팅
인스턴스 as! 변환할 타입    // 다운 캐스팅
  • 인스턴스가 변환할 타입과 호환 가능하면, 해당 타입으로 변환된 인스턴스를 반환
  • as: 업 캐스팅
    • 부모 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보 전환
    • Any, AnyObject로 변환도 가능 (상속 관계로 이루어지지 않았어도 가능)
    • 암시적으로 처리되므로 ( as 변환할 타입 ) 생략이 가능하다. (업 캐스팅은 항상 성공하기 때문)
    • let dong: Student = Student()
      
      let upCasting: Any = dong as Any
      let upCasting: Any = dong
  • as?, as! : 다운 캐스팅
    • 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보 전환
    • 다운 캐스팅은 실패할 수 있기 때문에 ?, ! 를 추가로 붙여서 사용
    • let dong: Person = Person()
      
      // let downCasting: Student = dong  당연히 암시적 처리로 코드 생략 불가능
      let downCasting: Student = dong as! Student
    • 만약 자식 클래스가 아닌 다른 클래스로 다운 캐스팅을 시도하면 에러남 -> 이를 방지하기 위해 옵셔널(?, !)이 붙은 것
    • as? : 런타임 시점에 다운 캐스팅을 시도하고, 실패할 경우 nil 반환
    • let dong: Person = Person()
      // nil을 리턴할 가능성이 있기 때문에 Optional로 선언해야됨
      let downCasting: Student? = dong as? Student   // nil
    • as! : 런타임 시점에 타입 캐스팅을 시도하고, 실패할 경우 에러 발생
    • let dong: Person = Person()
      
      let downCasting: Student = dong as! Student   // error: Execution was interrupted,,,
    • 옵셔널 강제 추출을 비추하는 것처럼 as! 보단 as? 사용을 권장함!
    • // if-let을 통해 옵셔널을 추출해서 사용 예시
      let dong: Person = Student() as Person  // Student로 생성하고, Person으로 업 캐스팅
      
      if let student = dong as? Student {
          print(student.studentNumber)    // 1234
      }
    • // 활용 예시2
      let dong: Person = Student() as Person  // Student로 생성하고, Person으로 업 캐스팅
      let jun: Person = Person()
      
      func doSomething(someone: Any) {
          if let student = someone as? Student {
              print(student.studentNumber)
          }else if let person = someone as? Person {
              print(person.name)
          }
      }
      
      doSomething(someone: dong)  // 1234
      doSomething(someone: jun)   // jun

 

 


알고리즘

https://co-dong.tistory.com/23

 

[1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

co-dong.tistory.com

 

반응형

'22 베이직 챌린지' 카테고리의 다른 글

Day15) Xcode 디버깅  (0) 2022.01.17
Day14) 객체지향 프로그래밍  (0) 2022.01.16
Day12) 옵셔널  (0) 2022.01.14
Day11) 프로토콜, 익스텐션  (0) 2022.01.13
Day10) 클래스와 상속  (0) 2022.01.12