[swift] 상속과 델리게이션 패턴의 관계 이해하기

프로그래밍에서 상속과 델리게이션은 객체 지향 설계에서 핵심적인 개념입니다. 두 가지 패턴은 코드를 재사용하고 모듈화하는 데 도움을 줍니다. 이번 포스팅에서는 Swift에서 상속과 델리게이션 패턴의 관계에 대해 자세히 알아보겠습니다.

상속

상속은 부모 클래스의 특성과 기능을 자식 클래스가 물려받는 것을 의미합니다. 부모 클래스는 기본적인 기능을 구현하고, 자식 클래스는 부모 클래스의 기능을 재사용하거나 확장하여 사용할 수 있습니다.

class Shape {
    var color: String?
    
    init(color: String) {
        self.color = color
    }
    
    func draw() {
        print("Drawing a shape with color \(color ?? "unknown")")
    }
}

class Circle: Shape {
    var radius: Double
    
    init(color: String, radius: Double) {
        self.radius = radius
        super.init(color: color)
    }
    
    override func draw() {
        print("Drawing a circle with color \(color ?? "unknown") and radius \(radius)")
    }
}

let circle = Circle(color: "red", radius: 5.0)
circle.draw()

위의 예제에서 Circle 클래스는 Shape 클래스를 상속받아 draw 메서드를 재정의하고, 새로운 속성 radius를 추가하고 있습니다.

델리게이션

델리게이션은 객체가 다른 객체의 일부 기능을 자신이 수행하지 않고, 다른 객체에게 위임하는 디자인 패턴입니다. 주로 프로토콜을 사용하여 구현됩니다.

protocol AlarmDelegate: AnyObject {
    func didRing()
}

class Alarm {
    weak var delegate: AlarmDelegate?
    
    func start() {
        // 알람이 울리면 delegate에 알림
        delegate?.didRing()
    }
}

class Person: AlarmDelegate {
    func didRing() {
        print("Wake up and turn off the alarm!")
    }
}

let alarm = Alarm()
let person = Person()
alarm.delegate = person
alarm.start()

위의 예제에서 Alarm 클래스는 알람이 울리면 delegate에 알림을 전달합니다. Person 클래스는 AlarmDelegate 프로토콜을 구현하여 알람이 울릴 때 실행될 동작을 구현합니다.

상속과 델리게이션의 관계

상속과 델리게이션은 코드 재사용과 모듈화를 돕는 데 사용되지만, 두 가지 패턴 간에는 중요한 관계가 있습니다. 자식 클래스는 부모 클래스의 특성을 물려받으면서 델리게이션을 통해 부모 클래스의 일부 기능을 위임할 수 있습니다. 이를 통해 코드의 유연성을 높일 수 있고, 객체 지향 설계의 원칙을 잘 지킬 수 있습니다.

델리게이션을 활용하여 상속받은 기능을 보완하거나 변경함으로써 프로그래머는 기능을 보다 세밀하게 제어할 수 있습니다.

이처럼, 상속과 델리게이션은 객체 지향 프로그래밍에서 강력한 도구로 활용되며, 두 가지를 함께 사용함으로써 보다 유연하고 확장성 있는 코드를 작성할 수 있습니다.

결론

이번 포스팅에서는 Swift에서의 상속과 델리게이션 패턴의 관계에 대해 알아보았습니다. 두 가지 개념은 각각 코드 재사용과 모듈화 측면에서 중요하며, 함께 사용함으로써 객체 지향 프로그래밍에서의 유연하고 효율적인 설계를 돕습니다.


참고 자료: