타입 캐스팅

박형석·2021년 12월 9일
0

Swift

목록 보기
10/20
post-thumbnail
post-custom-banner

String(Int)

  • swift 데이터 타입 안전 추구 → 다른 타입끼리의 값 교환을 엄격히 제한
  • 암시적 데이터 타입 변환(Implicit Type Conversion) 지원 X
    → String(Int), swift에선 새로운 인스턴스 생성이지 타입캐스팅 X
    → 물론 다른 언어에서는 타입 변환, 타입 캐스팅으로 불리지만 스위프트에서는 아님

Swift의 타입캐스팅

스위프트의 타입캐스팅은 다음을 할 수 있는 것을 의미한다.

  • 인스턴스의 타입 확인 is 연산자 사용
  • 다른 타입의 인스턴스인양 행세(전환, Cast) as 연산자 사용
    → 타입캐스팅으로 프로토콜을 준수하는지도 확인 가능

데이터 타입 확인

  • 타입 확인 연산자(is)

타입 확인 연산자(is)를 사용해서 인스턴스가 어떤 클래스의 인스턴스인지 타입을 확인할 수 있다. true/false를 반환한다. 클래스의 인스턴스에 주로 사용된다.

  • 메타 타입(meta type) : 타입의 타입

클래스 타입, 구조체 타입, 열거형 타입, 프로토콜 타입 등의 타입이다. 타입 자체를 하나의 타입으로 표현. 사실 클래스, 구조체, 열거형은 타입의 이름이다. 타입으로써의 정체성(meta type)을 드러내기 위해서는 .Type을 붙인다. 프로토콜은 .Protocol라고 붙인다.

SomeClass.Type
SomeProtocol.Protocol

self를 사용해서 타입을 값처럼 표현할 수 있다. 예를 들어 SomeClass.self라고 표현하면 SomeClass의 인스턴스가 아니라 SomeClass 타입을 값으로 표현한 값을 반환한다. SomeProtocol.self는 SomeProtocol을 준수하는 타입의 인스턴스가 아니라 SomeProtocol을 값으로 표현한 값을 반환한다.

런타임시에 타입을 확인하려면 type(of:) 사용한다.

let intType = Int.Type = Int.self
let myProtocol = SomeProtocol.Protocol = SomeProtocol.self

var somType: AnyType
someType = intType
print(someType) // Int

type(of: coffee) == Coffee.self

다운캐스팅

다음과 같이 어떤 클래스 타입의 변수 또는 상수가 정말로 해당 클래스의 인스턴스를 참조하지 않을 수도 있다.

// Coffee라는 타입의 상수가 Coffee 클래스의 인스턴스를 참조하고 있지 않다.
let myCoffee: Coffee = Latte(flavor: "vanilla")

이 때 아무리 myCoffee가 Latte 인스턴스를 가지고 있다고 하더라도 타입은 Coffee이기에 Latte 타입을 사용해야 하는 곳에서는 무용지물이다. 이를 위해 해당 상수의 타입을 변환해줘야 한다. 이를 다운캐스팅이라 한다.

클래스의 상속 모식도에서 부모클래스의 타입을 자식 클래스의 타입으로 캐스팅한다고 해서 다운 캐스팅

타입캐스트 연산자 : as! as?

  • as!는 다운캐스팅에 실패시 런타임 오류, as?는 nil을 반환한다.
  • 항상 성공하는 경우는 그냥 as를 사용.
    캐스팅하려는 타입이 같은 타입이거나 부모클래스 타입이라는 것을 알 때 사용. 보통 컴파일러도 안다.

캐스팅은 인스터스 수정 X, 값 변경 X 메모리에는 똑같이 남아있다.
다만, 인스턴스를 사용할 때 어떤 타입으로 다루고 접근해야 하는지 판단할 수 있도록 컴퓨터에 힌트 제공!

Any, AnyObject의 타입캐스팅

특정 타입을 지정하지 않고 여러 타입의 값을 할당할 수 있는 Any (함수를 포함한 모든 타입), AnyObject(클래스 타입만 의미) → 다운캐스팅 해서 타입에 맞게 사용해야 한다.

옵셔널 타입도 Any로 표현 가능. 그런데도 Any 자리에 옵셔널을 쓰면 컴파일러 경고... 이 때는 명시적으로 as Any로 해주면 경고가 없어진다.

profile
IOS Developer
post-custom-banner

0개의 댓글