타입 캐스팅이란?
- 일반적으로 타입 캐스팅의 의미는 형변환으로 다른 형태의 자료형으로 변환하는 것을 의미한다.
- 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! 사용
'IOS App Programming > Swift' 카테고리의 다른 글
[Swift] 오류처리 - throws, do-catch, try (0) | 2023.04.12 |
---|---|
[Swift] 프로토콜 - 프로토콜 구현, 채택, 클래스 전용 프로토콜 (0) | 2023.04.11 |
[Swift] 옵셔널 체이닝과 nil 병합 연산자 (0) | 2023.03.31 |
[Swift] 프로퍼티 - 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티, 프로퍼티 감시자 (0) | 2023.03.29 |
[Swift] 클로저 - 클로저란?, 후행 클로저, 클로저 표현 간소화 (0) | 2023.03.20 |
댓글