Swift - 타입 캐스팅이란?
Swift - 타입 캐스팅이란?
- 하위 클래스 인스턴스는 상위 클래스 타입으로 선언된 변수에 할당 가능함.
- 하위 클래스는 상위 클래스에 선언된 모든 프로퍼티, 메서드를 가지고 있기 때문임.
- 반대가 되는 경우는 성립하지 않는데, 하위 클래스에서 추가된 프로퍼티, 메서드를 상위 클래스에서는 알 수 없기 때문임.
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal{
var gender: String = "수컷"
var age: Int = 3
func makeSound(){
print("동물소리")
}
}
class Dog: Animal{
var weight: Double = 5.7
override func makeSound() {
print("월월")
}
}
var dog: Animal = Dog()
dog.makeSound()
결과
1
월월
하위 클래스에서 추가된 프로퍼티나 메서드에는 접근이 불가능하지만, 오버라이딩한 내용은 반영됨.
타입 비교 연산
is를 통해 타입을 비교 연산할 수 있음.
구문
1
값 is 타입
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal{
var gender: String = "수컷"
var age: Int = 3
func makeSound(){
print("동물소리")
}
}
class Dog: Animal{
var weight: Double = 5.7
override func makeSound() {
print("월월")
}
}
print(Dog() is Animal)
print(Dog() is Dog)
결과
1
2
true
true
하위 타입을 상위 타입과 비교할 때에도
true가 반환됨.
주의점
- 변수에 할당된 인스턴스를 비교할 때는 변수 데이터 타입이 아닌 실제로 할당되어 있는 인스턴스를 기준으로 비교 연산을 처리함.
에시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Animal{
var gender: String = "수컷"
var age: Int = 3
func makeSound(){
print("동물소리")
}
}
class Dog: Animal{
var weight: Double = 5.7
override func makeSound() {
print("월월")
}
}
var animal: Animal = Dog()
print(animal is Animal)
print(animal is Dog)
결과
1
2
true
true
위 예시에서는 변수 타입은 Animal이지만 실제 할당된 인스턴스는 Dog임.
비교 연산 결과 Animal로 비교 연산이 처리된 것이 아닌 Dog로 처리된 것을 확인할 수 있음.
형변환
- 특정 타입으로 선언된 값을 다른 타입으로 변환하는 것.
- 일반적으로 상속 관계에 있는 타입들에 한에서만 사용 가능함.
형변환은 두가지 유형이 있음
- 업캐스팅: 특정 타입보다 상위 타입으로 변환
- 다운캐스팅: 특정 타입보다 하위 타입으로 변한
업캐스팅
- 특정 타입보다 상위 타입으로 변환되는 것이기 때문에 오류 가능성이 없음
구문
1
객체 as 타입
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Animal{
var gender: String = "수컷"
var age: Int = 3
func makeSound(){
print("동물소리")
}
}
class Dog: Animal{
var weight: Double = 5.7
override func makeSound() {
print("월월")
}
}
class Poodle: Dog{
var cuteRate: Int = 100
}
var dog: Dog = Dog()
var animal = dog as Animal
print(animal.gender)
print(animal.age)
animal.makeSound()
결과
1
2
3
수컷
3
월월
다운 캐스팅
- 특정 타입보다 하위 타입으로 변환되기 때문에 오류 가능성이 있음
- 다운 캐스팅은 옵셔널 캐스팅, 강제 캐스팅으로 나뉨.
- 옵셔널 캐스팅은 오류가 발생할 수 있기 때문에 옵셔널로 감싸져서 나와짐
- 강제 캐스팅은 무조건 성공한다는 전제가 깔려있기 때문에 실패시 런타임 에러가 발생함.
구문
1
2
객체 as? 타입 // 옵셔널 캐스팅
객체 as! 타입 // 강제 캐스팅
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Animal{
var gender: String = "수컷"
var age: Int = 3
func makeSound(){
print("동물소리")
}
}
class Dog: Animal{
var weight: Double = 5.7
override func makeSound() {
print("월월")
}
}
class Poodle: Dog{
var cuteRate: Int = 100
}
var dog: Dog = Poodle()
var poodle = dog as? Poodle
if let poodle = poodle{
print(poodle.cuteRate)
}else{
print("형변환 실패")
}
var poodle2 = dog as! Poodle
print(poodle2.cuteRate)
결과
1
2
100
100
This post is licensed under CC BY 4.0 by the author.