[swift] Swift 상속과 다형성

Swift에서는 상속과 다형성을 지원하여 객체 지향 프로그래밍을 할 수 있습니다. 상속은 클래스 간에 코드를 재사용하고 확장하는 방법을 제공하며, 다형성은 같은 이름의 메서드나 속성을 서로 다른 클래스에서 다른 방식으로 동작하도록 하는 기능입니다.

상속(Inheritance)

상속을 통해 부모 클래스의 모든 속성과 메서드를 자식 클래스가 상속받을 수 있습니다. 자식 클래스는 부모 클래스의 기능을 확장하거나 변경할 수 있으며, 필요한 경우에는 새로운 속성이나 메서드를 추가할 수도 있습니다.

class Vehicle {
    var brand: String
    
    init(brand: String) {
        self.brand = brand
    }
    
    func drive() {
        print("Driving the vehicle...")
    }
}

class Car: Vehicle {
    func accelerate() {
        print("Accelerating the car...")
    }
}

let car = Car(brand: "BMW")
print(car.brand) // "BMW"
car.drive() // "Driving the vehicle..."
car.accelerate() // "Accelerating the car..."

위의 예제에서 Car 클래스는 Vehicle 클래스를 상속받아 brand 속성과 drive() 메서드를 사용할 수 있습니다. 또한 Car 클래스에는 accelerate() 메서드가 추가되어 있습니다.

다형성(Polymorphism)

Swift에서는 다형성을 통해 동일한 이름의 메서드나 속성이 서로 다른 클래스에서 다른 방식으로 동작할 수 있습니다. 이를 통해 유연하고 확장 가능한 코드를 작성할 수 있습니다. 다형성은 상속과 함께 사용될 때 가장 효과적으로 동작합니다.

class Shape {
    func draw() {
        print("Drawing a shape...")
    }
}

class Circle: Shape {
    override func draw() {
        print("Drawing a circle...")
    }
}

class Rectangle: Shape {
    override func draw() {
        print("Drawing a rectangle...")
    }
}

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

for shape in shapes {
    shape.draw()
}

위의 예제에서 Shape 클래스는 draw() 메서드를 정의하고 있습니다. Circle 클래스와 Rectangle 클래스는 각각 draw() 메서드를 오버라이드하여 원과 사각형을 그리는 기능을 추가하고 있습니다. 이렇게 Shape 클래스의 서브클래스들은 모두 Shape 타입으로 선언된 배열에 저장될 수 있습니다. 반복문을 통해 배열에 저장된 모든 도형을 그릴 수 있습니다. 이때, 각 객체의 실제 타입에 맞게 메서드가 호출되는 것을 확인할 수 있습니다.

결론

Swift에서 상속과 다형성을 사용하면 코드의 재사용성과 유연성을 높일 수 있습니다. 상속을 통해 클래스 간에 코드를 공유하고 확장할 수 있으며, 다형성을 통해 동일한 인터페이스를 가진 객체들이 서로 다른 방식으로 동작할 수 있습니다. 이를 잘 활용하여 유지보수가 용이하고 확장성 있는 애플리케이션을 개발할 수 있습니다.