[swift] 프로토콜 지향 프로그래밍

프로토콜 지향 프로그래밍은 객체 지향 프로그래밍에 대안으로 제안되는 패러다임입니다. 객체 지향 프로그래밍은 클래스를 통해 코드 재사용, 다형성 및 캡슐화를 제공합니다. 하지만 클래스 계층 구조가 복잡해질수록 유지 보수가 어려워질 수 있습니다. 이에 대한 대안으로 등장한 것이 프로토콜 지향 프로그래밍입니다.

프로토콜

프로토콜은 메서드, 속성 또는 기타 요구사항의 집합을 의미합니다. 프로토콜은 인터페이스의 일종으로 사용될 수 있으며, 구현해야 하는 요구사항을 정의할 수 있습니다. 이를 통해 다른 객체와의 상호작용을 보장하고 특정 동작을 위한 규칙을 명시할 수 있습니다.

프로토콜은 클래스, 구조체 또는 열거형에서 채택될 수 있습니다. 채택하게 되면 해당 객체는 프로토콜에서 정의한 요구사항을 모두 구현해야 합니다. 이는 프로토콜을 통해 다중 상속을 흉내낼 수 있는 장점을 제공합니다.

프로토콜 지향 프로그래밍의 장점

프로토콜 지향 프로그래밍은 다음과 같은 장점을 가지고 있습니다.

  1. 유연성: 객체간의 결합도를 낮추고 독립적인 개발 및 테스트가 가능해집니다.
  2. 확장성: 새로운 요구사항이 추가될 때 기존 코드를 수정하지 않고 새로운 프로토콜을 정의하고 채택함으로써 기능을 확장할 수 있습니다.
  3. 재사용성: 다른 프로토콜을 채택하여 요구사항을 충족시키는 객체를 만들 수 있습니다.
  4. 테스트 용이성: 프로토콜을 통해 인터페이스를 분리하고 의존성 주입을 통해 테스트하기 쉬운 코드를 작성할 수 있습니다.

예제

다음은 Swift에서 프로토콜을 적용한 예제 코드입니다.

protocol Vehicle {
    var brand: String { get }
    var speed: Double { get }
    
    func accelerate()
    func decelerate()
}

struct Car: Vehicle {
    let brand: String
    var speed: Double
    
    func accelerate() {
        speed += 10
    }
    
    func decelerate() {
        if speed > 10 {
            speed -= 10
        } else {
            speed = 0
        }
    }
}

struct Bike: Vehicle {
    let brand: String
    var speed: Double
    
    func accelerate() {
        speed += 5
    }
    
    func decelerate() {
        if speed > 5 {
            speed -= 5
        } else {
            speed = 0
        }
    }
}

위의 예제에서 Vehicle 프로토콜은 brand, speed 속성과 accelerate(), decelerate() 메서드를 요구합니다. CarBike 구조체는 Vehicle 프로토콜을 채택하여 요구사항을 모두 구현하고 있습니다.

결론

프로토콜 지향 프로그래밍은 객체 지향 프로그래밍의 한계를 극복하기 위해 등장한 패러다임입니다. 프로토콜은 다형성과 재사용성을 제공하며, 유연하고 확장 가능한 코드 작성을 가능하게 합니다. Swift에서도 프로토콜을 적용하여 객체 간의 관계를 유연하게 다룰 수 있습니다.