swift 기본문법 - 프로토콜(protocol)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.


프로토콜(protocol)

특정 역할을 수행하기 위한 메서드, 프로퍼티, 이니셜라이저 등의 요구사항을 정의한다.

어떤 타입에 이 기능이 필요해! 그러니 꼭 그 기능을 구현해놨어야해! 라고 강요하는 것과 같다.

구조체, 클래스, 열거형은 프로토코를 채택(adopted)하여 프로토콜의 요구사항을 실제로 구현 가능하다.
어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 프로토콜을 준수한다(Conform)고 표현한다.
프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 기능을 모두 구현해야 한다.

protocol 프로토콜 이름 {
  정의부
}

예시는 아래와 같다

protocol Talkable {
  // 프로퍼티 요구 >> 항상 var 키워드를 사용한다.
  var topic: String { get set }  // 읽기 쓰기 모두 가능한 프로퍼티
  var language: String { get }  // 읽기만 가능한 프로퍼티

  // 메서드 요구
  func talk()

 // 이니셜라이저 요구
  init(topic: String, language: String)
}

직접 구현을 하는것은 아니고 요구만 한다.

프로토콜의 채택 및 준수

// Person 구조체는 Talkable 프로토콜을 채택했다
struct Person: Talkable {

  // 저장 프로퍼티
  var topic: String
  var language: String

  // 위 저장 프로퍼티는 연산프로퍼티로 대체가 가능하다.
  var language: String { return "한국어" }

  var subject: String = ""
  var topic: String {
    set {
      self.subject = newValue
    }
    get {
      return self.subject
    }
  }
}

프로토콜 상속

클래스와 다르게 다중 상속이 가능하다.

protocol 프로토콜 이름: 부모 프로토콜 이름 목록 {
  정의부
}

프로토콜이 상속한 모든 메서드들을 구현하지 않으면 오류가 발생한다.

클래스 상속과 프로토콜

클래스에서 상속과 프로토콜 채택을 동시에 하려면 상속 받으려는 클래스를 먼저 명시하고 그 뒤에 채택할 프로토콜 목록을 작성한다.

순서가 바뀌면 안된다!

프로토콜 준수 확인

인스턴스가 특정 프로토콜을 준수하는 지 확인 가능하다 » is, as 연산자 사용