본문 바로가기
Swift/기본

프로토콜

by 밤새는탐험가 2024. 4. 11.

프로토콜은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 

청사진을 정의한다. 

 

구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 수행하기 위한

프로토콜의 요구사항을 구현할 수 있다. 

 

어떤 프로토콜의 요구사항을 모두 따르는 타입은 해당 프로토콜을 준수한다라고

표현한다. 타입에서 프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는

청사진의 기능을 모두 구현해야 한다. 

 

⭐️ 프로토콜은 기능을 정의하고 제시할 뿐, 스스로 기능을 구현하지 않는다. 

 

 

정의문법

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