[swift] 타입 캐스팅과 다형성의 관계

애플의 스위프트 언어는 강력한 타입 시스템을 가지고 있는데, 이것은 코드 안에서 안전한 형 변환이 가능하도록 해준다. 타입 캐스팅은 스위프트 언어에서 안전하게 인스턴스의 타입을 확인하거나, 해당 인스턴스의 타입을 부모 클래스나 자식 클래스의 타입으로 변환하는 기능을 제공한다.

타입 캐스팅을 통해 인스턴스의 타입을 확인하고, 해당 타입에 기반하여 작업을 수행할 수 있다. 이는 스위프트의 다형성을 활용하는 데 중요하다. 다형성은 한 가지 인터페이스나 추상클래스를 통해 서로 다른 구현체들을 사용할 수 있는 객체지향 프로그래밍의 원리이다.

타입 캐스팅의 종류

1. Upcasting
Upcasting은 인스턴스를 자신이 직접 상속하거나, 간접적으로 상속한 부모 클래스로 변환하는 것을 말한다. Upcasting은 항상 안전하므로 별도의 문법이 필요 없다.

class Animal {}
class Dog: Animal {}

let myDog = Dog()
let myAnimal: Animal = myDog // Upcasting

2. Downcasting
Downcasting은 슈퍼 클래스로 Upcasting된 인스턴스를 서브클래스의 타입으로 다시 변환하는 것을 말한다. 이때 실제로 해당 서브클래스의 객체여야만 구문이 성공된다. 따라서 이를 안전하게 처리하기 위해 조건부 다운캐스팅(as?)과 강제 다운캐스팅(as!) 두 가지 형태가 있다.

class Animal {}
class Dog: Animal {}

let myAnimal = Animal()
if let dog = myAnimal as? Dog { // Conditional Downcasting
    print("Success")
} else {
    print("Failed")
}

다형성의 활용

다형성을 이용하면 부모 클래스 타입으로 선언된 변수나 상수에 여러 가지 서브클래스의 객체를 할당할 수 있다. 이렇게 하면 같은 인터페이스를 통해 서로 다른 구현체를 사용할 수 있어 코드의 유연성을 높일 수 있다.

class Shape {
    func draw() {
        // default implementation
    }
}

class Circle: Shape {
    override func draw() {
        // draw a circle
    }
}

class Square: Shape {
    override func draw() {
        // draw a square
    }
}

let shapes: [Shape] = [Circle(), Square()]

for shape in shapes {
    shape.draw()
}

결론

타입 캐스팅과 다형성은 스위프트에서 안전하고 유연한 코드 작성을 가능하게 하는 중요한 기능이다. 올바르게 활용하면 다형성을 통해 여러 객체를 일관된 방식으로 처리하여 코드의 가독성과 유지보수성을 높일 수 있다.

관련 자료: The Swift Programming Language - Type Casting


위 글에서는 Swift 언어에서 타입 캐스팅과 다형성의 개념과 관련된 내용을 다루었습니다. 각각의 기능과 관련된 예제 코드를 사용하여 설명하고, 이를 통해 다형성이 객체지향 프로그래밍에서 얼마나 중요한지 이해를 돕았습니다.