본문 바로가기
IOS App Programming/Swift

[Swift] 프로토콜 지향 프로그래밍 - 프로토콜 초기 구현

by B_Tori 2023. 5. 6.

객체 지향 프로그래밍에서 프로토콜 지향 프로그래밍으로

객체 지향 프로그래밍 (OOP : Object-Oriented-Programming)

객체 지향 프로그래밍이란?

- 프로그램을 수많은 객체들로 나누어 이들의 상호 작용을 통해 프로그램을 구현하는 방식이다.

- 클래스의 상속을 통해 다형성을 구현한다 -> 공통 코드를 슈퍼클래스에서 제공하고 서브클래스는 이를 상속받아 구현

[단점]

  1. 슈퍼클래스에 너무 종속적이다.
    - 상속을 위해서 슈퍼클래스의 코드를 모두 알고있어야한다.
    - 대부분의 언어에서 다중 상속을 제공하고 있지 않아 서브 클래스는 자신한테 필요하지 않은 다른 서브클래스들의 공통 기능까지 상속받아야 한다. 이에 슈퍼클래스 또한 일부의 서브클래스들만 필요한 기능들이 계속 추가되다 보면 쓸데없이 규모가 커지게 된다.
  2. Value Type 사용 불가
    클래스는 참조타입이기에 값 타입으로 구현해도 되는 내용임에도 참조 타입으로 구현해야 함 -> 불필요한 참조 추적 비용이 발생하게 된다.

프로토콜 지향 프로그래밍 (POP : Protocol-Oriented-Programming)

필요한 부분만 프로토콜로 분리하여 프로그래밍하는 방법을 말한다.

[장점]

  1. 코드 중복 최소화
  2. OOP의 단점 개선 -> 가볍고 안전하며 값 타입 사용이 가능하다.
    - 다중 프로토콜이 가능하기에 상속과 달리 필요한 것들만 골라서 사용이 가능해진다.
    - 값 타입 사용으로 불필요한 참조 추적이 발생하지 않으며 공통 기능을 쉽게 구현이 가능하다.
  3. 상속의 수직확장과 달리 수평으로 확장 가능하다.
  4. 제네릭을 활용하여 다양한 기능을 제공할 수 있다.

 

프로토콜 초기 구현

스위프트는 다른 언어들과 달리 대부분의 타입이 클래스가 아닌 구조체로 정의되어 있다.

상속이 되지 않는 구조체가 어떻게 공통 기능을 구현할 수 있을까에 대해 살펴보면 프로토콜과 익스텐션을 사용한 것을 알 수 있다.

  • 익스텐션 : 기존 타입의 기능을 확장해 준다.
  • 프로토콜 : 채택한 타입은 해당 프로토콜의 요구사항을 모두 준수해야 한다.
//프로토콜 초기 구현 사용X
protocol Walkable{
    func walk()
}

struct Person:Walkable{
    var name:String
    func walk(){
        print("걷다")
    }
}

struct Animal:Walkable{
    var species:String
    func walk(){
        print("걷다")
    }
}

=> 프로토콜을 통해 공통적으로 구현해야 하는 기능들에 대해 요구 사항을 작성해 구조체에서 채택을 해준다.

그런데 하나의 프로토콜을 여러 타입이 채택하게 되면 똑같은 요구사항을 중복 구현해야 하는 상황이 발생한다.

이를 익스텐션으로 해결한다. 프로토콜 정의에서는 기능 구현을 할 수 없지만 프로토콜의 익스텐션에서는 기능 구현이 가능하기 때문이다.

 

즉, 프로토콜로 공통 기능을 요구하고, 프로토콜의 익스텐션을 통해 중복 구현을 방지한다.

따라서 프로토콜 초기 구현이라는 것은 아래와 같이 설명할 수 있다.

프로토콜 초기 구현이란?
여러 타입에서 중복적으로 요구사항을 구현해야 할 때, 익스텐션을 통해 미리 구현하여 각 타입에서는 구현하지 않아 코드의 중복을 막는 것이다. 

만약 익스텐션으로 구현한 기능을 사용하지 않고 타입의 특성에 따라 변경하고 싶다면 단순하게 타입에서 재정의 하면 된다.

두 구조체의 walk함수 사용 결과

익스텐션을 통해 walk함수를 미리 구현하여 Person과 Animal 구조체에서는 따로 구현하지 않았지만 모두 walk함수를 사용할 수 있다.

이번에는 Flyable이라는 프로토콜과 Bird라는 구조체를 추가하였다.

Brid구조체는 Flyable과 Walkable을 모두 채택하여 fly와 walk를 모두 사용할 수 있다.

하지만 Brid에서는 walk함수에서 그냥 걷는 것이 아니라 날지 않고 걷는다는 것을 표현하기 위해 walk함수를 재정의 하였다.

실행 결과는 다음과 같다.

 

 

댓글