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

이정훈·2024년 12월 31일
0

Swift 파헤치기

목록 보기
10/10
post-thumbnail

Swift 언어는 객체 지향 프로그래밍, 프로토콜 지향 프로그래밍, 함수형 프로그래밍 등을 차용한 다중 패러다임 프로그래밍 언어이다. 이번 포스트에서는 그 중 프로토콜 지향 프로그래밍에 대해 알아보자.

POP (Protocol Oriented Programming)

Swift는 다른 프로그래밍 언어와 다르게 구조체열겨형 타입 또한 클래스처럼 다양한 기능을 제공한다. 대표적으로 Swift의 표준 라이브러리의 타입들은 대부분 구조체로 구현되어 있다.

객체 지향 프로그래밍에서는 클래스상속을 통해 추상화와 기능의 확장을 구현할 수 있었다. 하지만 구조체열거형은 상속이 불가능한데 어떻게 공통 기능의 확장을 구현할 수 있었을까? Apple은 이것에 대해 protocolextension의 결합으로 답한다.

이미 알고 있듯이 protocolprotocol을 채택한 타입에서 protocol이 요구하는 기능을 구현하도록 강제한다. 하지만 수 많은 타입에서 protocol이 요구하는 프로퍼티, 메서드, 서브스크립트 등을 중복으로 구현하는 것은 너무나도 비효율적이다. 소프트웨어공학을 배웠다면, 이러한 중복된 코드 구현을 최소화하고 효율적이며 유지보수가 용이한 코드를 작성하는 것이 중요하다는 것은 이미 자명하다. Apple은 클래스 뿐만 아니라 다른 다양한 타입에서도 상속을 대체하여 기능 확장을 확장하며 재사용성을 증가 시키기 위해 protocolextension을 이용하여 기능을 확장하는 프로토콜 지향 프로그래밍을 강조한다.

protocol Vehicle {
    var speed: Int { get set }
    
    func move()
}

extension Vehicle {
    func move() {
        print("탈 것이 \(speed) km/h로 이동 중 입니다.")
    }
}

struct Car: Vehicle {
    var speed: Int
}

struct Train: Vehicle {
    var speed: Int
}

let myCar: Car = Car(speed: 80)
myCar.move()

let myTrain: Train = Train(speed: 120)
myTrain.move()

CarTrainVehicle protocol을 채택하고 있지만 구현체에 구현한 요구사항은 speed 프로퍼티 뿐이다. move()의 구현은 extension에 구현하여 Vehicle protocol을 채택한 모든 타입이 공통적으로 사용한다. 이렇게 타입에 protocol을 채택하기만 하면 코드의 재사용성을 증가시킬 수 있다.

만약 공통적으로 사용하는 extension의 기능 대신 타입의 특성에 따라 다르게 구현해야 한다면, 구현체에 protocol의 요구사항을 다시 한번 정의하면 된다.

struct Ship: Vehicle {
    var speed: Int
    
    func move() {
        print("배가 \(speed) km/h로 물 위를 이동 중입니다.")
    }
}

let myShip: Ship = Ship(speed: 30)
myShip.move()

위의 코드와 같이 Swiftprotocol의 요구사항이 protocol 구현체에 구현되어 있는지 확인 후 호출하고 만약 구현체에 구현이 되어 있지 않다면, protocolextension에서 호출한다.

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

1. protocol 다중 채택 가능

Swift에서 클래스상속은 기본적으로 단일 상속 밖에 지원하지 않는다. 하지만 protocol은 다중 채택이 가능하여 프로토콜 지향 프로그래밍을 사용 한다면 다중 상속을 적용한 것과 같은 효과를 구현할 수 있다.

2. Value Type 사용

class의 참조 타입은 메모리 할당과 해제, 그리고 참조 추적에 많은 비용이 발생한다. 반면, 값 타입의 경우 스택 메모리를 사용함으로써 런타임 속도를 확보할 수 있다.

profile
새롭게 알게된 것을 기록하는 공간

0개의 댓글

관련 채용 정보