프로토콜이란?
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
'내일배움캠프 iOS' 카테고리의 다른 글
iOS) TIL #13 야구게임 만들기 - Lv 1 (0) | 2024.11.06 |
---|---|
iOS) TIL #12 (TIL #9 관련) 계산기 코드 구현하기 - 피드백 및 수정 (0) | 2024.11.05 |
iOS) TIL #10 확장 (extension) (0) | 2024.11.01 |
iOS) TIL #9 2주차 과제 - 계산기 코드 구현하기 (0) | 2024.10.31 |
iOS) TIL #8 학습법 및 알고리즘 특강 (0) | 2024.10.30 |