프로토콜은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 기타 요구사항 등의
청사진을 정의한다.
구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 수행하기 위한
프로토콜의 요구사항을 구현할 수 있다.
어떤 프로토콜의 요구사항을 모두 따르는 타입은 해당 프로토콜을 준수한다라고
표현한다. 타입에서 프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는
청사진의 기능을 모두 구현해야 한다.
⭐️ 프로토콜은 기능을 정의하고 제시할 뿐, 스스로 기능을 구현하지 않는다.
정의문법
protocol 프로토콜 이름 {
/* 정의부 */
}
프로토콜의 요구는 항상 "var" 키워드를 사용한다.
get은 읽기만 가능, get + set을 모두 명시하면 읽기 + 쓰기 모두 가능하다는 뜻이다.
프로토콜 구현
protocol Talkable {
var topic: String { get set }
var language: String { get }
// 메서드 요구
func talk()
// 이니셜라이저 요구
init(topic: String, language: String)
}
프로토콜 채택 및 준수
struct Person: Talkable {
// 프로퍼티 요구 준수
var topic: String
let language: String
// 메서드 요구 준수
func talk() {
print("\(topic)에 대해 \(language)로 말합니다")
}
// 이니셜라이저 요구 준수
init(topic: String, language: String) {
self.topic = topic
self.language = language
}
}
var jerry: Person = Person(topic: "환경", language: "한국어")
jerry.talk() // 환경에 대해 한국어로 말합니다
struct Person: Talkable {
var subject: String = ""
// 프로퍼티 요구는 연산 프로퍼티로 대체가 가능합니다
var topic: String {
set {
self.subject = newValue
}
get {
return self.subject
}
}
var language: String { return "한국어" }
func talk() {
print("\(topic)에 대해 \(language)로 말합니다")
}
init(topic: String, language: String) {
self.topic = topic
}
}
var jerry: Person = Person(topic: "경제", language: "영어")
jerry.talk() // 경제에 대해 한국어로 말합니다
jerry.topic = "한국사"
jerry.talk() // 한국사에 대해 한국어로 말합니다
print(jerry.subject) // 한국사
jerry.subject = "주식 수익"
print(jerry.topic) // 주식 수익
jerry.talk() // 주식 수익에 대해 한국어로 말합니다
프로토콜 상속
프로토콜은 하나 이상의 프로토콜을 상속받아 기존 프로토콜의 요구사항보다 더 많은
요구사항을 추가할 수 있다.
프로토콜은 클래스의 상속과 다르게 다중 상속이 가능하다.
protocol 프로토콜 이름: 부모 프로토콜 이름 목록 {
/* 정의부 */
}
protocol Readable {
func read()
}
protocol Writeable {
func write()
}
protocol ReadSpeakable: Readable {
func speak()
}
protocol ReadWriteSpeakable: Readable, Writeable {
func speak()
}
struct SomeType: ReadWriteSpeakable {
func read() {
print("Read")
}
func write() {
print("Write")
}
func speak() {
print("Speak")
}
}
클래스 상속과 프로토콜
클래스에서 상속과 프로토콜 채택을 동시에 하려면 상속받으려면
클래스를 먼저 명시하고, 그 뒤에 채택할 프로토콜 목록을 작성한다.
class SuperClass: Readable {
func read() { }
}
class SubClass: SuperClass, Writeable, ReadSpeakable {
func write() { }
func speak() { }
}
'Swift > 기본' 카테고리의 다른 글
오류처리 (0) | 2024.04.13 |
---|---|
익스텐션 (0) | 2024.04.12 |
assert와 guard (0) | 2024.04.09 |
옵셔널 체이닝 (0) | 2024.04.06 |
인스턴스의 생성과 소멸 (0) | 2024.04.05 |