이 포스트는 야곰님의 Swift 프로그래밍 2판을 보고 스스로 공부한 내용을 정리한 포스트 입니다.


예제 코드


참고 자료


프로토콜의 상속과 클래스 전용 프로토콜

  • 프로토콜은 하나 이상의 프로토콜을 상속받아 기존 프로토콜의 요구사항보다 더 많은 요구사항을 추가할 수 있다.

  • 프로토콜 상속 문법은 클래스의 상속 문법과 유사하다.

ProtocolExampleImage-13

  • ReadSpeakable 프로토콜은 Readable 프로토콜을 상속받았다.

  • ReadWriteSpeakable 프로토콜은 Readable과 Writeable 프로토콜을 상속받았다.

  • ReadWriteSpeakable 프로토콜을 채택(Adopted)한 SomeClass는 세 프로토콜(Readable, Writeable, ReadWriteSpeakable)이 요구하는 read(), write(), speak() 메서드를 모두 구현해야 한다.

ProtocolExampleImage-14

  • 프로토콜 상속 리스트에 'class' 키워드를 추가프로토콜이 클래스 타입에만 채택될 수 있도록 제한할 수도 있다.

  • 클래스 전용 프로토콜로 제한을 주기 위해서는 '프로토콜의 상속 리스트 맨 처음에 class 키워드'가 위치해야 한다.


프로토콜 조합과 프로토콜 준수 확인

ProtocolExampleImage-15 ProtocolExampleImage-16

  • 하나의 매개변수(Parameter)가 여러 프로토콜을 모두 준수하는 타입이어야 한다면 하나의 매개변수에 여러 프로토콜을 한 번에 조합(Composition)하여 요구할 수 있다.

    • 프로토콜을 조합하여 요구할 때는 'SomeProtocol & AnotherProtocol'과 같이 표현한다.
  • 하나의 매개변수가 프로토콜을 둘 이상 요구할 수도 있다.

    • 이때도 마찬가지로 앰퍼샌드(&)를 여러 프로토콜 이름 사이에 써주면 된다.
  • 특정 클래스의 인스턴스 역활을 할 수 있는지 함께 확인할 수 있다.

  • 구조체나 열거형 타입은 조합할 수 없다.

  • 조합 중 클래스 타입은 한 타입만 조합할 수 있다.


프로토콜 캐스팅

ProtocolExampleImage-17

  • 타입캐스팅에 사용하던 'is와 as 연산자'를 통해 대상이 프로토콜을 준수하는지 확인할 수도 있고, 특정 프로토콜로 캐스팅할 수도 있다.

  • 프로토콜을 준수하는지 확인하거나 다른 프로토콜로 캐스팅하는 방법은 타입캐스팅 방법과 똑같다.

    • is 연산자를 통해 해당 인스턴스가 특정 프로토콜을 준수하는지 확인할 수 있다.

    • as? 다운캐스팅 연산자를 통해 다른 프로토콜로 다운캐스팅을 시도해볼 수 있다.

    • as! 다운캐스팅 연산자를 통해 다른 프로콜로로 강제 다운캐스팅을 할 수 있다.

  • '프로토콜 조합과 프로토콜 준수 확인'의 코드에 이어 '프로토콜 캐스팅'의 코드를 작성해보면 데이터 타입의 타입캐스팅과 똑같다는 것을 확인할 수 있다.

    • 프로토콜도 하나의 타입이므로 당연하다.