프로토콜지향 프로그래밍(POP)

고라니·2023년 7월 12일
0

TIL

목록 보기
9/67

프로토콜 지향 프로그래밍(POP)

애플은 스위프트 2.0을 발표하며 '스위프트는 프로토콜 지향 언어다' 라고 발표했다. 그렇다면 이 프로토콜 지향 프로그래밍(Protocol-Oriented Programming, POP)이라는 개념은 무엇일까?

POP?

POP는 스위프트의 프로토콜 중심 설계에 초점을 맞춘다. 대부분 객체지향 프로그래밍 패러다임에 기반을 둔 언어는 클래스의 상속을 통해 타입에 공통된 기능을 구현한다. 하지만 스위프트는 상속이 불가한 구조체로 많은 타입들을 구현하고 있다. 이게 가능한 이유가 바로 프로토콜과 익스텐션의 활용이다.

프로토콜과 익스텐션

프로토콜은 채택한 타입에 원하는 기능을 강제로 구현해야 하는 요구사항을 정의하는 청사진이라고 했다. 익스텐션은 기존의 타입의 기능을 확장한다. 이 두가지를 결합하면 코드중복을 피하면서 타입에 원하는 기능을 제공할 수 있는 강력한 기능을 발휘할 수 있다. 이를 프로토콜의 초기구현이라고 한다.

프로토콜의 초기 구현

아래의 코드는 공통된 기능 구현을 위해 코드가 중복되고 있다.

protocol Movable {
    func moveToForward()
}

strcut Car: Movable {
	func moveToForward() {
    	print("앞으로 나아간다.")
    }
}

struct BikeL moveable {
	func moveToForward() {
    	print("앞으로 나아간다.")
    }
}

아래의 코드는 익스텐션을 사용하여 프로토콜 초기구현 하였고, 중복된 코드 없이 구현 가능하게 되었다. 또한 클래스의 상속과 다르게 중복 채택이 가능한 것을 확인 할 수 있다.

protocol Drivable {
    func startEngine()
    func stopEngine()
}

protocol Movable {
    func moveToForward()
}

extension Drivable {
    func startEngine() {
        print("엔진이 시작된다.")
    }

    func stopEngine() {
        print("엔진이 멈춘다.")
    }
}

extension Movable {
    func moveToForward() {
        print("앞으로 나아간다.")
    }
}

struct Car: Drivable, Movable { } // 중복 채택

let car = Car()
car.startEngine() // "엔진이 시작된다."
car.moveToForward() // "앞으로 나아간다."
car.stopEngine() // "엔진이 멈춘다."

이렇게 프로토콜 초기 구현을 통해 여러 프로토콜을 그저 채택만 하기만 하면 그 타입에서 해당 기능을 사용할 수 있게 된다.

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

  1. 타입에 대한 유연성: 구조체, 클래스, 열거형 등의 타입 중에서 상속은 클래스에서만 가능하다. 하지만 클래스는 참조 타입이므로 비용이 많이 발생한다. 이와 달리 값 타입은 낮은 비용을 가지지만, 상속이 불가하므로 기능들을 다시 구현해야 했다. 프로토콜 지향 프로그래밍은 기능을 프로토콜 단위로 묶어 초기 구현이 가능하여, 상속의 한계를 없앨 수 있다.

  2. 모둘화 및 재사용성 강화: 클래스는 단일 상속만 가능하므로, 다중 상속을 필요로 하는 경우 문제가 발생한다. 하지만 프로토콜은 다중 채택이 가능하므로, 다양한 타입에서 필요한 프로토콜들을 한개 이상 채택하여 재사용할 수 있다. 이를 통해 클래스의 단일상속의 한계를 넘어 중복 코드 없이 여러 타입에서 필요한 동일한 기능들을 구현하 가능하다.

결론

프로토콜 지행 프로그래밍은 상속의 한계를 극복하고, 코드의 재사용성과 모듈화를 높이는 강력한 도구다. 특히 스위프트 같은 프로토콜 중심 언어에서는 더욱 중요하며, 이를 활용하면 훨씬 효율적이고 유지보수가 쉬운 코드를 작성할 수 있다.

참고: Swift Language guide, 부스트코스 iOS 앱 프로그래밍

profile
🍎 무럭무럭

0개의 댓글