안녕하세요~~ 오늘은 스위프트의 프로토콜에 대해서 열심히 공부를 해보겠습니다! 오늘은 애플에서 만든 스위프트 가이드를 참고하여 공부를 해보았습니다. 그럼 더 자세히 알아보죠!
애플 공식 문서에서는 프로토콜을 다음과 같이 정의합니다. "프로토콜은 특정 작업 또는 기능에 적합한 메서드, 속성 및 기타 요구 사항의 Blueprint를 정의합니다." 프로토콜은 클래스, 구조 또는 열거에 의해 채택되어 그러한 요구 조건의 실제 구현을 제공할 수 있고 프로토콜의 요구 사항을 충족하는 모든 유형은 해당 프로토콜을 준수한다고 합니다.
- 프로토콜의 정의
protocol 프로토콜 이름 { 프로토콜 내용 }
그럼 프로토콜 코드를 작성해서 좀 더 자세하게 알아보겠습니다.
protocol SomeProtocol {
var mustBeSettable: Int { get set }
var doesNotNeedToBeSettable: Int { get }
}
SomeProtocol를 하나 만들고 안에 프로퍼티 두개를 생성하였습니다. 프로토콜에서 프로퍼티를 정의할 때에는 get 과 set 키워드를 사용해 프로퍼티가 읽기 전용 프로퍼티인지 읽기 쓰기 프로퍼티인지를 반드시 명시를 해줘야 합니다. { get set }은 읽기 쓰기 프로퍼티이고 { get }은 읽기 전용 프러퍼티입니다.
다음과 같이 프로퍼티가 하나인 프로토콜이 있다고 가정 해봅시다.
protocol FullyNamed {
var fullName: String { get }
}
fullname이라는 읽기 전용 프로퍼티를 하나 만들었습니다. 이 프로토콜을 이제 채택하고 준수하는 하나의 구조체를 만들어보겠습니다.
struct Person: FullyNamed {
var fullName: String
}
let john = Person(fullName: "John Appleseed")
print(john.fullName) //"John Appleseed"
마치 클래스나 구조체에서 상속받는 것과 비슷한 느낌으로 사용할 수 있습니다. 하지만 프로토콜에서는 요구한 프로퍼티가 있다면 이 프로토콜을 채택한 모든 타입은 요구한 프로퍼티를 모두 구현해야합니다.
프로토콜에도 메소드를 작성할 수 있습니다. 하지만 일반적인 메소드와는 다르게 메소드의 본문은 포함하지 않는다고 하네요. 아래의 코드에서 프로토콜의 메소드를 살펴보겠습니다.
protocol RandomNumberGenerator {
func random() -> Double
}
이렇게 프로토콜을 하나 작성했다면 이 프로토콜을 채택하는 클래스 또한 하나 만들어 보겠습니다.
class LinearCongruentialGenerator: RandomNumberGenerator {
var lastRandom = 42.0
let m = 139968.0
let a = 3877.0
let c = 29573.0
func random() -> Double {
lastRandom = ((lastRandom * a + c)
.truncatingRemainder(dividingBy:m))
return lastRandom / m
}
}
RandomNumberGenerator 프로토콜을 채택한 LinearCongruentialGenerator 클래스에서 요구사항에 맞게 random()를 구현했습니다.
스위프트는 프로토콜 지향 프로그래밍입니다. 따라서 스위프트는 프로토콜 초기 구현을 잘 해두면 이렇게 프로토콜 채택만으로도 그 기능을 사용할 수 있게 됩니다. 프로토콜 초기 구현이 프로토콜 지향 프로그래밍의 핵심이라고 볼 수 있습니다.
스위프트에서는 클래스만 상속이 가능하고 클래스는 참조 타입이므로 참조 추적에 비용이 많이 발생한다고 합니다. 그래서 비교적 비용이 적은 값 타입을 활용하고 싶어도, 상속을 할 수 없으므로 때마다 기능을 다시 구현해 주어야 한다는 불편함을 가지고 있었죠. 하지만 프로토콜 지향 프로그래밍은 기능을 프로토콜이라는 단위로 묶어 표현하고 초기 구현을 해 둘 수 있으니 상속이라는 한계점을 탈피할 수 있습니다. 한마디로 초기에 구현해 놓은 많은 프로퍼티나 메소드를 우리가 쉽게 채택하여서 사용을 할 수 있다는 큰 장점을 가지게 됩니다!
오늘은 프로토콜에 대해 아주 기본적인 내용만 공부를 해보았습니다. 애플 문서에서는 매우 복잡하고 많은 내용들이 있지만 아직은 기초 지식을 쌓는데 더 집중을 해야될 것 같아 나중에 다시 제대로 공부해보겠습니다! 그럼 오늘 하루도 수고 많으셨습니다!