Swift '문법'

타입 캐스팅

김동준. 2024. 8. 7. 21:14

타입 캐스팅(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' 인지 확인하고 적절한 메서드를 호출하고 있습니다.