-
[Swift] Swift 기본 문법 정리 4: Protocol 📑Swift 2023. 1. 30. 21:47
시작하며
Swift를 배우면서 가장 흥미로웠던 부분은 이 protocol이었다. typescript에서 제공하는 type과 interface을 통한 다형성과 유연성을 제공해주어 기존 js가 가진 불안한을 해소시켜 주었었다. 이번 protocol 정리와 다음에 정리한 extension을 통해 이후에 나올 Swift의 POP를 가능하게 하는지 이해할 수 있었으면 좋겠다.
Protocol
- 프로토콜은 지켜야할 규칙, 즉 인터페이스로 struct, class, enum 등이 가져야 할 메소드나 프로퍼티의 청사진을 정의한다.
- 특정 기능을 실행하기 위해 프로토콜을 채택하고 그 요구사람을 구현하면 "해당 프로토콜을 준수한다"라고 말할 수 있다.
Protocol 구조와 Protocol 채택
//프로토콜 정의 protocol 프로토콜이름 { 프로퍼티 요구 메서드 요구 이니셜라이저 요구 } //프로토콜 채택 struct 구조체이름: 프로토콜이름 { //해당 프로토콜의 요구사항을 구현해야 한다. } //여러개의 프로토콜을 채택할 경우 struct 구조체이름: 프로토콜1, 프로토콜2, 프로토콜3 ... { ... }
프로퍼티 요구
- 프로토콜을 따르는 대상이 특정 프로퍼티를 구현하도록 요구할 수 있다.
- 요구를 할 때는 var 키워드를 사용한다.
- 구현시 연산 프로퍼티(computed property)로 구현할 수도 있다.
- 옵셔널로 사용하고 싶은 경우 @objc 키워드를 붙여서 만들 수 있다.
protocol Person { // 읽기 전용 프로퍼티를 요구할 경우 var name: String { get } // 읽기와 쓰기 모두 가능하게 요구할 경우 var age: Int { get set } } @objc protocol Human { var age: Int { get set } @objc optional var nickname: String { get set } } struct Student: Person { //읽기 전용으로 프로퍼티 요구를 했기 때문에 let, var 모두 사용가능 let name: String //get, set 모두 가능하게 요구하기 때문에 반드시 var를 사용 var age: Int }
메서드 요구
- 프로토콜에서 특정 메서드나 타입 메서드를 요구할 수 있다.
- 메서드를 정의할 때는 함수명과 반환값을 설정할 수 있다.
- struct와 같이 값 타입에서 내부의 값을 변경할 경우 mutating 키워드를 사용해서 명시해주어야 한다. 해당 mutating 키워드를 가진 프로토콜을 class에서 구현할 경우 mutating 키워드는 뺴고(class는 reference type이기 때문에) 구현하면 된다.
protocol Person { func walk() } struct Student: Person { func walk(){ print("walking🚶♂️") } } protocol Human { var age: Int { get } mutating func setAge(_ newAge: Int) } struct Moon: Human { var age: Int = 0 mutating func setAge(_ newAge: Int) { age = newAge } } var moon = Moon() moon.setAge(26) moon.age
프로토콜 상속
protocol Person { var name: String } protocol Student: Person { var major: String func study() }
프로토콜을 준수하는지 확인하기
- is, as 연산자를 사용해서 해당 인스턴스가 특정 프로토콜을 준수하는지 확인할 수 있다.
protocol PersonP { var name: String { get } } protocol StudentP: PersonP { var major: String { get } func study() } struct Student: StudentP { var name: String = "" var major: String = "" func study(){ print("study hard") } } var austin: Student = Student() austin is PersonP // true
참고자료
https://babbab2.tistory.com/175
Swift) Protocol 이해하기 (2/6) - 프로퍼티 / 메서드 선언 이해하기
안녕하세요!? 소들입니다 ☘️ 저번 포스팅에서 프로토콜이 무엇인지에 대해 간단하게 공부했잖아요!?!?! 이번엔 이 프로토콜을 프로퍼티, 메서드로 선언할 때의 여러 가지 특징(?)에 대해 공부
babbab2.tistory.com
오늘의 Swift 상식 (Protocol)
프로토콜이란?
medium.com
'Swift' 카테고리의 다른 글
[Swift] 메모리 참조 strong, weak, unowned 비교 (0) 2023.02.09 [Swift] Swift 기본 문법 정리 5: Property (0) 2023.02.01 [Swift] Swift 기본 문법 정리 5-1: 왜 Swift에는 Sturct와 Class로 나뉘어 있을까. (0) 2022.12.26 [Swift] Swift 기본 문법 정리 3: 클로저 (2) 2022.12.21 [Swift] Swift 기본 문법 정리 2: 함수 (0) 2022.12.16