본문 바로가기
IOS App Programming/Swift

[Swift] 타입캐스팅 - is, as 연산자

by B_Tori 2023. 4. 11.

타입 캐스팅이란?

  • 일반적으로 타입 캐스팅의 의미는 형변환으로 다른 형태의 자료형으로 변환하는 것을 의미한다.
  • swift의 특징 중 하나는 데이터 타입의 안전을 위해 각기 다른 값 교환을 엄격히 제한한다.
    -> 다른 언어에서 지원하는 암시적 데이터 타입 변환을 지원하지 않는다.
var num :Double = 3.3
var convertedNum:Int = Int(num)
convertedNum = 5.5 //오류 발생
  • 다른 언어에서는 5.5를 대입시 Double -> Int로 암시적 형변환이 이루어져서 대입되므로 오류가 발생하지 않지만 스위프트에서는 오류가 발생한다.
  • 스위프트에서 Int(num)부분은 타입을 변환한 것이 아니라 Int의 이니셜라이저를 통해 기존 값을 전달받아 새로운 Int구조체의 인스턴트를 생성한 것 -> 타입 변환 x, 새로운 인스턴스 생성 O

 

Swift의 타입 캐스팅

  • 인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스턴스인 양 행세할 수 있는 방법이다.
  • 주로 참조 타입에서 사용됨
  • 자식 클래스는 부모클래스의 특성을 모두 포함하므로 자식 클래스가 부모 클래스인척 할 수 있다.
    하지만 반대로 부모클래스는 자식클래스인척 할 수 없다.
  • is연산자와 as 연산자를 사용

Is 연산자

  • 데이터 타입을 확인하는 연산자
  • 인스턴스가 해당 클래스의 인스턴스 거나, 그 클래스의 자식 클래스 인스턴스라면 true 반환, 그렇지 않다면 false반환

" 인스턴스 is 타입명 " 형태로 사용

예를 들어 A클래스를 상속받은 자식클래스 B, C가 있을 때

A, B, C타입인 각각의 인스턴스를 a, b, c라고 하자

1. a is A  //true 2. b is A  //true 3. c is A   //true
4. a is B  //false 5. a is C   //false 6. b is C, c is B  //false

1번의 경우 해당 클래스의 인스턴스이기 때문에 당연히 true이다.

2, 3번의 경우 b와 c는 A클래스의 자식클래스 B, C의 인스턴스이기 때문에 true이다.

4,5번의 경우 부모 클래스는 자식 클래스인척 할 수 없기 때문에 false이다.

6번은 당연히 b와 c는 아무런 관련이 없으므로 false이다.

 

as 연산자

  • 타입 캐스트 연산자

" 변수 as 타입 / 변수 as? 타입 / 변수 as! 타입 " 형태로 사용

  • 변수가 뒤의 타입과 호환된다면 해당 타입으로 캐스팅된 새 인스턴스를 리턴
  • as : 항상 성공한다는 보장이 있을 때 사용
  • as? : 성공 시 인스턴스 반환, 아닐 시 nil반환
  • as! : 강제 캐스팅으로 캐스팅 실패 시 런타임 오류 발생 

업캐스팅

  • 자식클래스의 객체를 부모클래스로 캐스팅하는 것
  • 업 캐스팅은 항상 캐스팅에 성공함 -> as 연산자 사용

다운캐스팅

  • 부모 클래스의 인스턴스를 서브클래스로 캐스팅하는 것
  • 업캐스팅 된 것을 다시 되돌릴 때 사용
  • 실패할 수 있음 -> as? 또는 as! 사용

댓글