티스토리 뷰
[시작]
- Swift는 데이터 타입 안전을 위하여 서로 다른 타입끼리의 값 교환을 엄격하게 제한함
- 암시적 데이터 타입 변환을 지원하지 않음
: C언어에서의 (int)10.4f와 Swift에서의 Int(10.4)는 서로 같지 않음
[기존 언어의 타입 변환과 스위프트의 타입 변환]
- Swift에서는 기존 값을 전달인자로 받은 생성자를 통해 새로운 타입의 인스턴스를 생성함
- 이를 타입 변환 또는 타입캐스팅이라고 칭하지 않음
- 생성자를 통해 새로운 인스턴스를 생성하는 과정일 뿐임
[스위프트 타입캐스팅]
- Swift의 타입캐스팅은 인스턴스의 타입을 확인하거나 자신을 다른 타입의 인스턴스인 것처럼 가장할 수 있는 방법으로 사용 가능함
- is와 as 연산자로 구현
- 자식 클래스는 부모 클래스인 것처럼 행할 수 있지만, 부모 클래스는 자식 클래스인 것처럼 행할 수 없다.
: 부모 클래스의 타입을 갖는 변수에 자식 클래스의 인스턴스를 할당할 수 있음
[데이터 타입 확인]
- 타입 확인 연산자 is를 사용하여 인스턴스가 어떤 클래스 또는 어떤 클래스의 자식 클래스의 인스턴스인지 타입을 확인해볼 수 있음
- 모든 데이터 타입에 사용할 수 있음
1 2 | print("Swift" is Int) //false print(1234 is Int) //true | cs |
- 메타 타입 타입을 이용하여 타입을 확인할 수도 있음
: 메타 타입 타입 : 타입의 타입
- 타입의 이름 뒤에 .Type를 붙이면 클래스, 구조체, 열거형의 이름의 메타 타입을 나타냄
- 프로토콜의 이름 뒤에 .Protocol을 붙이면 프로토콜의 이름의 메타 타입을 나타냄
- self를 사용해서 타입을 값처럼 표현할 수 있음
: 클래스 이름 뒤에 .self를 붙이면 클래스의 인스턴스가 아니라 클래스의 타입을 값으로 표현한 값을 반환함
: 프로토콜 이름 뒤에 .self를 붙이면 프로토콜을 준수하는 타입의 인스턴스가 아니라 프로토콜을 값으로 표현한 값을 반환함
1 2 | let a = 3 type(of: a) == Int.self //true | cs |
[다운캐스팅]
1 | let actingConstant: Coffee = Latte(flavor: "vanilla", shot: 2) | cs |
위의 코드에서 변수는 Coffee 인스턴스를 참조하도록 선언되었으나 Coffee 타입인 척 하는 Latte 타입의 인스턴스를 참조하고 있음.
이 상황에서 변수가 참조하는 인스턴스를 진짜 타입인 Latte 타입으로 사용해야 할 때가 있음
(Latte 타입에 정의되어 있는 프로퍼티나 메서드에 접근하려 할 때)
이 경우 다운캐스팅을 해주어야 함
- 클래스의 상속 모식도에서 자식 클래스보다 더 상위에 있는 부모 클래스의 타입을 자식 클래스의 타입으로 캐스팅하는 것
- Any, AnyObject 등에서 다른 타입을 캐스팅 할때도 사용
- 타입캐스트 연산자 as?, as!
: as? : 다운캐스팅이 실패하면 nil을 반환, 성공하면 옵셔널 타입으로 인스턴스를 반환
: as! : 다운캐스팅이 실패하면 런타임 오류 발생, 성공하면 다운캐스팅된 타입의 인스턴스를 반환
: as : 컴파일러가 다운캐스팅을 확신할 수 있는 경우 사용 가능
[Any, AnyObject의 타입 캐스팅]
- Swift에는 특정 타입을 지정하지 않고 여러 타입의 값을 할당할 수 있는 Any와 AnyObject라는 타입이 있음
- Any : 함수 타입을 포함한 모든 타입
- AnyObject : 클래스 타입만
- 프레임워크를 사용할 때 Any나 AnyObject로 값이 반환된다면 전달받은 데이터가 어떤 타입인지 확인하고 타입캐스팅을 명시적으로 해주어야 함