내일배움캠프 iOS

iOS) TIL #11 프로토콜(Protocol)

yjuni22 2024. 11. 4. 23:34

프로토콜이란?

class, struct, enum 에서 공통으로 구현해야 하는 메소드프로퍼티의 청사진을 정의하는 기능입니다.

 

  • 프로토콜 자체는 기능을 구현하지 않으며, 오직 설계만 제공합니다.
  • class, struct, enum 에서 프로토콜을 채택할 수 있으며, 프로토콜에서 정의한 프로퍼티와 메소드를 모두 구현해야 합니다.
    • 프로토콜을 채택하는 방법은 타입의 이름 뒤에 : 콜론을 넣은 후 프로토콜 이름을 작성하면 됩니다.
    • 프로토콜은 여러 개를 채택 할 수 있으며, 프로토콜 이름을 , 로 구분합니다.
  • 프로토콜에서 정의된 프로퍼티는 항상 var 로 선언되어야 합니다.
  • 프로토콜에서 정의하는 프로퍼티는 읽기 전용 { get } 또는 읽기-쓰기 가능 { get set } 으로 설정할 수 있습니다.
    • 최소한의 요구사항을 지정
    • { get } -> 저장 속성: let/var , 계산 속성: 읽기(get) / 읽기쓰기(get/set)
    • { get set } -> 저장 속성: var , 계산 속성: 읽기쓰기(get/set)
    • { get } 으로만 설정해도 프로퍼티의 값을 변경할 수 있지만, 명시적으로 작성하면 코드의 의도를 쉽게 파악할 수 있습니다.
  • 프로토콜에서 정의하는 메소드는 이름,파라미터, 리턴타입만 선언하며, 구현부 { } 는 작성하지 않습니다.
  • 스위프트는 프로토콜을 "일급객체"로 취급 프로토콜은 타입이다 ( 변수에 할당 가능, 함수 호출 시 파라미터로 가능, 함수에서 반환 가능 )
  • Swift에서 프로토콜은 다른 언어에서 말하는 인터페이스 개념과 유사합니다.

프로토콜 기본 문법

1) 정의

- 프로토콜을 만들어 필요한 요구사항만을 정의함.

protocol MyProtocol {
// "요구사항 만 정의
func doing() -> Int
}

2) 채택

class Class: MyProtocol {
}

3) 구현

class Class: MyProtocol {
func doing() -> Int {
return 1    // 요구사항 구현
    }
}

 

클래스 전용 프로토콜 AnyObject

  • class 전용 프로토콜은 struct, enum에서 사용될 수 없습니다.
  • 프로토콜 정의 시, AnyObject를 채택하면 클래스 전용 프로토콜로 만들 수 있습니다.
protocol SomeType: AnyObject {
}

 

다이렉트 디스패치 or Static Dispatch

타입에 따라 다른 메서드 실행

클래스 인스턴스를 프로토콜 타입으로 저장했을 때 - Direct (직접 메서드 주소 삽입)

let iphone: Iphone = Iphone()      vs    let iphone2: Mobile = Iphone()

요구사항 O -> 동일 protocol Witness table

요구사항 선언 X -> 타입채택 시 사용자 구현 확장 기본구현

class virtal table vs direct dispatch