Swift의 프로토콜 지향 프로그래밍(Protocol-Oriented Programming)의 장점은 무엇이며, 이를 클래스 기반 프로그래밍과 비교했을 때 어떤 차이점이 있나요?

민경준·2024년 1월 7일
2
post-thumbnail

Description

프로토콜 지향 프로그래밍(POP)은 Swift에서 사용하는 강력한 프로그래밍 패러다임 중 하나이다. 여러 프로토콜을 채택할 수 있어 다중 상속과 유사한 특성을 제공한다. 또, 프로토콜은 클래스뿐만 아니라 구조체와 열거형에도 적용 될 수 있다. 이는 값 타임을 강화하고 불변성(Immutability)을 유지할 수 있는데 도움이 된다.

프로토콜을 중심으로 하는 디자인은 더 모듈화되고 유연한 코드를 작성할 수 있게 도와준다. 그리고 기능을 정의하는데 중점을 두므로, 타입에 제약을 덜 가하고 더 일반적인 동작을 정의할 수 있다. 이러한 특징들은 테스트, 기능 확장, 유지보수, 재사용성을 높이는데 도움이 된다.

반대로 클래스는 단일 상속만을 지원하며, 상속은 클래스끼리만 할 수 있다. 클래스는 주로 상속을 통한 코드 재사용을 강조하는 반면, 프로토콜은 특정 기능을 가져오는 방식을 강조한다. 이는 더 모듈화된 코드와 유연한 디자인을 가능하게 한다.

프로토콜을 활용한 설계에서 주의해야 할 점은 무엇인가요?

너무 많은 프로토콜을 정의하거나 너무 많은 기능을 포함시키면 코드가 복잡해지고 유지보수가 어려워진다. 필요한 경우에만 도입하고, 지나치게 추상화된 프로토콜은 피하는것이 좋다. 프로토콜은 프로젝트 전체에서 사용될 수 있으므로, 코드를 수정할 때 주의가 필요하다. 기존에 채택된 타입들에 대한 호환성을 유지하려면 프로토콜 내에 코드를 추가하거나 수정하는것 보단 새로운 프로토콜을 도입하는것이 바람직하다.

프로토콜 확장(Protocol Extension)을 사용하여 코드 재사용성을 높이는 방법은 무엇인가요?

프로토콜 확장(PE)을 사용하면 기존의 프로토콜에서 새로운 기능을 추가 하거나, 이미 채택된 기능에 대해 기본 구현을 제공하여 코드 재사용성을 높일 수 있다. 예를 들면 여러 타입에 대해 공통적으로 사용되는 요소들을 확장을 통해 한 번에 정의하고, 코드 중복을 최소화 할 수 있다. 단, 의도치 않게 충돌이 발생하지 않도록 의도한 대로 동작하는지 테스트 하는것이 중요하다.

protocol Printable {
    func description()
}

extension Printable {
    func description() {
        print("Default implementation")
    }
}

struct Dog: Printable {
    // Dog은 Printable 프로토콜을 채택하며, description을 구현하지 않음
}

struct Cat: Printable {
    // Cat은 Printable 프로토콜을 채택하며, description을 구현하지 않음
}

let dog = Dog()
let cat = Cat()

dog.description()  // "Default implementation"
cat.description()  // "Default implementation"
profile
iOS Developer 💻

0개의 댓글