프로토콜
특정 역할을 하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의한 것
구조체, 클래스, 열거형은 프로토콜을 채택해서 프로토콜의 요구사항을 구현함으로써 프로토콜을 준수하며, 트로토콜이 정의한 특정 기능을 수행할 수 있음.
프로토콜 요구사항
프로토콜을 채택한 타입이 특정 기능을 수행하기 위해 필요한 프로퍼티나 메서드와 같은 기능.
- 프로퍼티 요구
- 프로토콜을 채택한 타입이 어떤 프로퍼티를 구현해야하는지 요구하는 것
- 프로퍼티의 이름과 타입만 준수하면 됨. (연산 프로퍼티 or 저장 프로퍼티 무관)
- 프로토콜이 해당 프로퍼티를 읽기 전용으로 할지, 읽고 쓰기가 모두 가능하게 할지 정함.
- 타입 프로퍼티 (static 변수)를 요구하려면 static 키워드 사용 (class, static 구분없이)
- 메서드 요구
- 인스턴스 메서드, 타입 메서드(static method)를 요구할 수 있음
- 타입 메서드를 요구할 경우 static 키워드를 명시하며, 구현할 때는 static or class 사용 무방.
- 프로토콜에서는 메서드의 이름, 매개변수, 반환 타입 만 정의함
- 가변 매개변수도 허용하지만, 매개변수의 기본값을 정해줄 수는 없음
- 구현할 때는 메서드의 중괄호 부분을 구현
- 가변 메서드 요구 (mutating)
- 값 타입의 경우, 메서드가 인스턴스 내부의 값을 변경할 수 있을 때는 mutating 키워드를 명시해줘야함.
- 프로토콜도 그런 메서드를 요구할 때에는 메서드에 mutating 키워드를 달아줘야함.
- 가변 메서드 요구사항을 구현할 때에는 클래스라면 mutating 키워드를 안써줘도 되지만, 구조체나 열거형이 프로토콜을 채택할 경우 mutating 키워드를 명시해줘야함.
- 이니셜라이저 요구
- 이니셜라이저 요구사항의 경우 상속이 되지 않는 값타입의 경우가 아니라 상속이 가능한 클래스가 프로토콜을 채택하는 경우에 특별히 신경써야하는 부분이 있음.
- 해당 클래스를 상속 받는 클래스도 해당 이니셜라이저 요구사항을 구현해야하기 때문에 required 식별자를 이니셜라이저 앞에 붙여야함.
- 의미는 “이 프로토콜을 준수하는 클래스를 상속받는 클래스도 이 이니셜라이저를 구현해야해”이다.
- 더이상 상속되지 않는 final 클래스라면 required를 붙이지 않아도 됨
프로토콜과 관련하여 애플의 프레임워크에서 사용하는 주요한 패턴인 위임 패턴 (delegate pattern)을 프로토콜을 사용하여 구현한다. 이에 대해서는 다른 포스팅에 정리해두었다.
https://sio2whocode.tistory.com/306
[iOS] Delegate & Protocol
Delegate & Protocol patterndelegate와 protocol 패턴은 one-to-one communication pattern이다.여기서 one to one 이 의미하는 건 흔한 예시로는 뷰와 뷰 사이의 통신을 말함.⇒ 뷰 사이의 통신을 delegate와 protocol로 구현
sio2whocode.tistory.com
프로토콜 확장 (protocol extension)
프로토콜 확장은 프로토콜에 새로운 기능을 추가할 수 있는 기능이다.
추가할 수 있는 기능: 프로퍼티, 메서드, 이니셜라이저, 서브스크립트, 중첩타입, 특정 프로토콜을 준수할 수 있도록 기능 추가
상속은 수직 확장 방식이지만, 익스텐션은 수평 확장 방식임. 익스텐션은 모든 타입에서 사용할 수 있음.
프로토콜 지향 프로그래밍 (POP)
클래스의 상속을 사용하여 타입에 공통된 기능을 구현하는 객체지향 프로그래밍 언어와 달리,
프로토콜과, 프로토콜 익스텐션을 사용하여 공통된 프로토콜 기능은 프로토콜 익스텐션에서 구현하고,
프로토콜을 채택하는 타입에서는 프로토콜 익스텐션에 구현된 공통 기능을 사용할 수 있게 하여 중복 구현을 줄이고, 각 타입에 다르게 설정되어야 하는 메서드나 프로퍼티들은 타입에서 구현될 수 있다. 이를 프토토콜 초기구현이라고 한다.
프로토콜 지향 프로그래밍 (POP) 장점
- 값 타입에도 상속과 유사한 기능을 구현할 수 있게 한다. (이로 인해 스위프트의 기본 타입이 값 타입으로 구현되어 상속받을 수 없는 한계를 극복할 수 있다.)
- 프로토콜 초기구현을 활용하여 중복 코드를 최소화할 수 있다.
- 필요한 프로토콜만 채택해서 사용할 수 있다.
- 수평적인 확장이 가능하다.
- 제네릭의 활용이 광범위해진다.
참고자료
야곰 "스위프트 프로그래밍 3판" 책
'iOS' 카테고리의 다른 글
[iOS] Under the hood: SwiftUI (번역 및 정리) (0) | 2025.04.04 |
---|---|
[iOS] Network Calls (네트워크 호출) (0) | 2025.03.28 |
[iOS] View Life Cycle (UIKit) (0) | 2025.03.28 |
[iOS] Delegate & Protocol (0) | 2025.03.26 |
[iOS+@] Concurrency (동시성) (0) | 2025.03.25 |