Protocol이란?
프로토콜은 약속, 규율, 규칙이라는 이야기가 많다. 프로토콜내부에 약속등을 정해 놓으면 프로토콜을 채택하는 클래스, 구조체, 열거형은 반드시 규칙에 따라 작성되어야 한다.
이 과정을 잘지키면 프로토콜을 채택하고 잘 준수했다고 한다.
따라서, 프로토콜은 메서드, 프로퍼티등의 청사진을 의미한다.
Protocol 사용예시
protocol SomeProtocol {
var mustBeSettable: Int { get set } //프로퍼티 요구사항
var doesNotNeedToBeSettable: Int { get } //프로퍼티 요구사항
func someMethod() -> String //메서드 요구사항
init(parameter: Int) //이니셜라이저 요구사항
}
위의 예시처럼 프로퍼티, 메서드, 이니셜라이저등 필요한 요구사항들을 정해줄 수 있다 SomeProtocol을 채택한 클래스, 구조체등은 반드시 준수해야함!
프로퍼티는 항상 var로 선언해야함!!
프로토콜의 프로퍼티 요구사항에서는 프로퍼티가 읽기 전용(get)인지, 읽기/쓰기 가능(get set)한지 명시합니다. 따라서, 실제 구현에서는 var로 선언해야 합니다.
struct SomeStruct: SomeProtocol {
var mustBeSettable: Int
var doesNotNeedToBeSettable: Int
func someMethod() -> String {
return "Hello, World!"
}
init(parameter: Int) {
self.mustBeSettable = parameter
self.doesNotNeedToBeSettable = parameter
}
}
이 예제에서는 SomeStruct가 SomeProtocol을 채택하고 있으며, 프로토콜의 모든 요구사항을 충족시키고 있습니다. mustBeSettable과 doesNotNeedToBeSettable 프로퍼티를 구현했고, someMethod 메서드와 init(parameter:) 이니셜라이저도 구현했습니다.
프로토콜의 장점
프로토콜은 코드의 재사용성을 높이고, 서로 다른 타입들 간에 일관된 인터페이스를 제공함으로써 코드의 유연성을 증가시킵니다. 이를 통해 다양한 타입이 공통된 방식으로 상호작용할 수 있습니다.
또한, 프로토콜은 프로토콜 자체의 기본 구현을 제공할 수 있는 프로토콜 확장(Protocol Extension)을 지원합니다. 이를 통해 프로토콜을 채택한 타입들이 공통적으로 사용할 기본 동작을 정의할 수 있습니다.
예?