🔥 프로토콜 상속
프로토콜은 하나 이상의 다른 프로토콜을 상속할 수 있으며, 상속받은 요구사항 위에 추가적인 요구사항을 더할 수 있습니다. 프로토콜 상속 문법은 클래스 상속 문법과 유사하지만, 쉼표로 구분된 여러 개의 상속받은 프로토콜을 나열할 수 있다는 점이 다릅니다.
protocol InheritingProtocol: SomeProtocol, AnotherProtocol { // 프로토콜 정의가 여기에 들어갑니다. }
swift
위의 예시에서는 이전에 살펴본 TextRepresentable
프로토콜을 상속하는 프로토콜을 정의하고 있습니다.
protocol PrettyTextRepresentable: TextRepresentable { var prettyTextualDescription: String { get } }
swift
이 예제는 TextRepresentable
을 상속하는 새로운 프로토콜인 PrettyTextRepresentable
을 정의합니다. PrettyTextRepresentable
을 채택하는 모든 것은 TextRepresentable
에서 강제하는 모든 요구사항을 만족해야 하며, 추가로 PrettyTextRepresentable
에서 강제하는 요구사항도 만족해야 합니다. 이 예제에서 PrettyTextRepresentable
은 String
을 반환하는 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
이렇게 프로토콜 상속을 활용하면 기존 프로토콜의 요구사항을 포함하면서도 추가적인 요구사항을 더할 수 있어 프로토콜의 기능을 확장하고 세분화할 수 있습니다. 이는 코드의 모듈성과 재사용성을 높이는 데 큰 도움이 됩니다.
프로토콜 상속의 관계를 도식화하면 다음과 같습니다.
TextRepresentable
은 PrettyTextRepresentable
의 상위 프로토콜이며, PrettyTextRepresentable
은 SnakesAndLadders
타입에서 채택되고 준수됩니다. 이렇게 프로토콜 상속을 통해 프로토콜 간의 계층 구조를 만들고, 이를 활용하여 코드의 추상화 수준을 높일 수 있습니다.