1장에서 다루는 내용
- 프로토콜을 사용해 프로퍼티와 기능 요구 사항을 정의하는 방법
- 프로토콜 상속과 컴포지션을 사용하는 방법
- 프로토콜을 타입으로 사용하는 방법
- 다형성
- 프로토콜을 사용해 연관 타입을 사용하는 방법
- 프토로콜을 사용해 델리게이션 패턴을 구현하는 방법
- 프로토콜을 사용해 타입 요구사항을 설계하는 방법
객체지향에서 인터페이스는 메서드와 프로퍼티 시그니처를 포함하는 타입이며, 구현체는 포함하지 못한다. 인터페이스를 따르는 모든 타입은 인터페이스에서 정의한 필요한 기능을 반드시 구현해야 한다.
객체지향 방식으로 어플리케이션을 설계 시 보통 클래스 계층 구조와 객체가 어떻게 상호작용하는지에 중점을 둔다. 객체란 프로퍼티 형태로 객체 속성에 관한 정보를 가지며, 메서드 형태로 객체가 수행하는 행위를 포함하는 자료구조다. 클래스는 객체의 프로퍼티와 행위를 단일 타입으로 캡슐화하는 구성체다.
프로토콜지향 방식으로 어플리케이션을 설계하느 것은 객체지향 방식으로 설계하는 것과는 상당한 차이가 있다. 프로토콜지향 설계는 클래스 계층 구조로 시작하는 대신 프로토콜로 시작해야 한다.
스위프트에서 프로토콜은 객체지향 언어의 인터페이스와 유사하다. 프로토콜은 작업을 수행하기 위해 타입에서 필요로 하는 메서드, 프로퍼티, 그리고 다른 요구 사항을 정의하는 계약의 역할을 한다. 프로토콜을 채택한 타입이 프로토콜이 정의한 기능을 모두 구현하지 않았을 경우 컴파일 타이멩서 에러가 발생하고, 프로젝트는 컴파일되지 못한다. 스위프트에서는 어떠한 클래스나 구조체 또는 열거형도 프로토콜을 준수할 수 있다.
스위프트의 프로토콜은 인터페이스와 유사하지만, 대부분의 객체지향 언어의 인터페이스보다 실제로 훨씬 강력한 기능을 제공한다.
대부분의 현대적인 객체지향 프로그래밍 언어는 클래스 계층 구조를 사용해 표준 라이브러리를 구현한다. 그러나 스위프트 표준 라이브러리는 프로토콜에 기반을 둔다.[1] 그렇기 때문에 애플은 개발자에게 프로토콜지향 프로그래밍 패러다임을 사용하게 권장할 뿐 아니라, 애플 스스로 스위프트 표준 라이브러리에서 사용하고 있다.
프로토콜에 대한 자세한 설명이 필요하다면 아래 문서를 살펴보자. The Swift Programming Language(5.9.2) - Protocols
[1]> 본문에는 swiftdoc.org 링크를 달았었는데, Swift 5.1 버전 기반문서여서, 관련된 다른 링크로 대체한다. > - Swift Framework Documentation > - The Swift Programming Language(5.9.2) > - Swift Github Repository