타입 캐스팅
타입 캐스팅(Type Casting)은 프로그래밍에서 하나의 데이터 타입을 다른 데이터 타입으로 변환하는 과정을 말합니다.
Swift에서 타입 캐스팅은 주로 클래스 계층 구조에서 구조에서 인스턴스의 타입을 확인하거나 상위 클래스 또는 하위 클래스로 변환할 떄 사용 됩니다.
Swift에서의 타입 캐스팅
Swift는 두가지 기본 타입 캐스팅 연산자를 제공합니다.
1. ' is' 연산자
2. 'as' 연산자
'is' 연산자
'is' 연산자는 인스턴스가 특정 타입의 하위 클래스인지 확인하는 데 사용됩니다. 이 연산자는 Boolean 값을 반환합니다.
class Animal {}
class Dog: Animal {}
let animal: Animal = Dog()
if animal is Dog {
print("animal is a Dog")
}
'as' 연산자
'as' 연산자는 인스턴스를 다른 타입으로 캐스팅하는 데 사용됩니다. 이 연산자는 세 가지 형태로 사용됩니다.
1. 조건부 캐스팅 (Optional)('as?')
2. 강제 캐스팅 ('as!')
3.업캐스팅 ('as')
조건부 캐스팅('as?')
조건부 캐스팅은 실패할 수 있는 타입 캐스팅입니다. 캐스팅에 실패하면 'nil'을 반환합니다.
이를 통해 안전하게 캐스팅을 시도할 수 있습니다.
let animal: Animal = Dog()
if let dog = animal as? Dog {
print("animal was successfully cast to Dog")
} else {
print("casting failed")
}
강제 캐스팅 ('as!')
강제 캐스팅은 캐스팅이 항상 성공할 것으로 확신할 떄 사용합니다. 만약 캐스팅이 실패하면 런타임 에러가 발생합니다.
let animal: Animal = Dog()
let dog = animal as! Dog
print("animal was cast to Dog")
업캐스팅('as')
업캐스팅은 서브클래스의 인스턴스를 슈퍼클래스 타입으로 변환할 떄 사용됩니다. 이는 항상 성공합니다.
class Animal {}
class Dog: Animal {}
let dog = Dog()
let animal: Animal = dog // 업캐스팅
예제: 타입 캐스팅 사용하기
아래는 타입 캐스팅을 활용한 예제입니다:
class Animal {
var name: String
init(name: String) {
self.name = name
}
}
class Dog: Animal {
func bark() {
print("Woof!")
}
}
class Cat: Animal {
func meow() {
print("Meow!")
}
}
let animals: [Animal] = [Dog(name: "Buddy"), Cat(name: "Mittens"), Dog(name: "Rex"), Cat(name: "Whiskers")]
for animal in animals {
if let dog = animal as? Dog {
print("\(dog.name) is a Dog")
dog.bark()
} else if let cat = animal as? Cat {
print("\(cat.name) is a Cat")
cat.meow()
}
}
위의 예제에서는 'Animal' 클래스를 상속받는 'Dog' 와 'Cat' 클래스를 정의하고, 타입 캐스팅을 사용하여 배열의 각 요소가 'Dog' 인지
'Cat' 인지 확인하고 적절한 메서드를 호출하고 있습니다.