Swift

[Swift] Swift 기본 문법 정리 4: Protocol 📑

moonkey 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

https://medium.com/@jgj455/%EC%98%A4%EB%8A%98%EC%9D%98-swift-%EC%83%81%EC%8B%9D-protocol-f18c82571dad

 

오늘의 Swift 상식 (Protocol)

프로토콜이란?

medium.com