🔥 프로토콜 상속

361자
5분

프로토콜은 하나 이상의 다른 프로토콜을 상속할 수 있으며, 상속받은 요구사항 위에 추가적인 요구사항을 더할 수 있습니다. 프로토콜 상속 문법은 클래스 상속 문법과 유사하지만, 쉼표로 구분된 여러 개의 상속받은 프로토콜을 나열할 수 있다는 점이 다릅니다.

protocol InheritingProtocol: SomeProtocol, AnotherProtocol {
    // 프로토콜 정의가 여기에 들어갑니다.
}
swift

위의 예시에서는 이전에 살펴본 TextRepresentable 프로토콜을 상속하는 프로토콜을 정의하고 있습니다.

protocol PrettyTextRepresentable: TextRepresentable {
    var prettyTextualDescription: String { get }
}
swift

이 예제는 TextRepresentable을 상속하는 새로운 프로토콜인 PrettyTextRepresentable을 정의합니다. PrettyTextRepresentable을 채택하는 모든 것은 TextRepresentable에서 강제하는 모든 요구사항을 만족해야 하며, 추가로 PrettyTextRepresentable에서 강제하는 요구사항도 만족해야 합니다. 이 예제에서 PrettyTextRepresentableString을 반환하는 prettyTextualDescription이라는 gettable 속성을 제공하는 단일 요구사항을 추가합니다.

SnakesAndLadders 클래스는 PrettyTextRepresentable을 채택하고 준수하도록 확장될 수 있습니다.

extension SnakesAndLadders: PrettyTextRepresentable {
    var prettyTextualDescription: String {
        var output = textualDescription + ":\n"
        for index in 1...finalSquare {
            switch board[index] {
            case let ladder where ladder > 0:
                output += ""
            case let snake where snake < 0:
                output += ""
            default:
                output += ""
            }
        }
        return output
    }
}
swift

이 확장은 PrettyTextRepresentable 프로토콜을 채택하고 SnakesAndLadders 타입에 대한 prettyTextualDescription 속성의 구현을 제공합니다. PrettyTextRepresentable인 것은 반드시 TextRepresentable이어야 하므로, prettyTextualDescription의 구현은 TextRepresentable 프로토콜의 textualDescription 속성에 접근하여 출력 문자열을 시작합니다. 여기에 콜론과 줄바꿈을 추가하고, 이를 예쁜 텍스트 표현의 시작으로 사용합니다. 그런 다음 보드 칸 배열을 반복하면서 각 칸의 내용을 나타내는 기하학적 모양을 추가합니다.

  • 칸의 값이 0보다 크면 사다리의 밑면이며, 로 표현됩니다.
  • 칸의 값이 0보다 작으면 뱀의 머리이며, 로 표현됩니다.
  • 그 외의 경우 칸의 값은 0이며, "자유로운" 칸으로 로 표현됩니다.

이제 prettyTextualDescription 속성을 사용하여 SnakesAndLadders 인스턴스의 예쁜 텍스트 설명을 출력할 수 있습니다.

print(game.prettyTextualDescription)
// 25개의 칸으로 이루어진 뱀과 사다리 게임:
// ○ ○ ▲ ○ ○ ▲ ○ ○ ▲ ▲ ○ ○ ○ ▼ ○ ○ ○ ○ ▼ ○ ○ ▼ ○ ▼ ○
swift

이렇게 프로토콜 상속을 활용하면 기존 프로토콜의 요구사항을 포함하면서도 추가적인 요구사항을 더할 수 있어 프로토콜의 기능을 확장하고 세분화할 수 있습니다. 이는 코드의 모듈성과 재사용성을 높이는 데 큰 도움이 됩니다.

프로토콜 상속의 관계를 도식화하면 다음과 같습니다.

lecture image

TextRepresentablePrettyTextRepresentable의 상위 프로토콜이며, PrettyTextRepresentableSnakesAndLadders 타입에서 채택되고 준수됩니다. 이렇게 프로토콜 상속을 통해 프로토콜 간의 계층 구조를 만들고, 이를 활용하여 코드의 추상화 수준을 높일 수 있습니다.