[iOS / Swift] Swift 문법을 알아보자! - 16편 : 프로토콜(Protocol)

프린스송·2021년 7월 6일
2

Swift 문법

목록 보기
16/21
post-thumbnail

안녕하세요~~ 오늘은 스위프트의 프로토콜에 대해서 열심히 공부를 해보겠습니다! 오늘은 애플에서 만든 스위프트 가이드를 참고하여 공부를 해보았습니다. 그럼 더 자세히 알아보죠!


프로토콜 (Protocol)

애플 공식 문서에서는 프로토콜을 다음과 같이 정의합니다. "프로토콜은 특정 작업 또는 기능에 적합한 메서드, 속성 및 기타 요구 사항의 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()를 구현했습니다.


왜 프로토콜을 쓸까

스위프트는 프로토콜 지향 프로그래밍입니다. 따라서 스위프트는 프로토콜 초기 구현을 잘 해두면 이렇게 프로토콜 채택만으로도 그 기능을 사용할 수 있게 됩니다. 프로토콜 초기 구현이 프로토콜 지향 프로그래밍의 핵심이라고 볼 수 있습니다.

스위프트에서는 클래스만 상속이 가능하고 클래스는 참조 타입이므로 참조 추적에 비용이 많이 발생한다고 합니다. 그래서 비교적 비용이 적은 값 타입을 활용하고 싶어도, 상속을 할 수 없으므로 때마다 기능을 다시 구현해 주어야 한다는 불편함을 가지고 있었죠. 하지만 프로토콜 지향 프로그래밍은 기능을 프로토콜이라는 단위로 묶어 표현하고 초기 구현을 해 둘 수 있으니 상속이라는 한계점을 탈피할 수 있습니다. 한마디로 초기에 구현해 놓은 많은 프로퍼티나 메소드를 우리가 쉽게 채택하여서 사용을 할 수 있다는 큰 장점을 가지게 됩니다!


오늘은 프로토콜에 대해 아주 기본적인 내용만 공부를 해보았습니다. 애플 문서에서는 매우 복잡하고 많은 내용들이 있지만 아직은 기초 지식을 쌓는데 더 집중을 해야될 것 같아 나중에 다시 제대로 공부해보겠습니다! 그럼 오늘 하루도 수고 많으셨습니다!

profile
[iOS / Swift] [React Native]

0개의 댓글