Swift: Protocol / 프로토콜

Wooyo·2023년 10월 24일
0
post-thumbnail

1. Protocol

  • 특정 역할을 수행하기 위한 메서드 / 프로퍼티 / 요구사항의 청사진
  • 구조체 / 클래스 / 열거형은 프로토콜을 채택해서 요구사항을 구현 가능
  • 프로토콜은 기능을 정의하고 제시 / 스스로 구현하지는 않는다.
protocol ProtocolName {
	// code
}

2. 구현 예시

protocol Talkable {
    // 프로퍼티 요구
    // 프로퍼티 요구는 var 키워드를 사용
    // get은 읽기만 가능해도 상관 없다는 뜻
    // get과 set을 모두 명시하면
    // 읽기 쓰기 모두 가능한 프로퍼티
    var topic: String { get set }
    var language: String { get }
    // 메서드 요구
    func talk()
    // 이니셜라이저 요구
    init(topic: String, language: String)
}

3. 프로토콜 채택 및 준수

// Person 구조체는 Talkable 프로토콜을 채택했습니다
struct Person: Talkable {
    // 프로퍼티 요구 준수
    var topic: String
    let language: String
    // 읽기전용 프로퍼티 요구는 연산 프로퍼티로 대체가 가능
//    var language: String { return "한국어" }
    // 읽기, 쓰기 프로퍼티도 연산 프로퍼티로 대체할 수 있음
//    var subject: String = ""
//    var topic: String {
//        set {
//            self.subject = newValue
//        }
//        get {
//            return self.subject
//        }
//    }
    // 메서드 요구 준수
    func talk() {
        print("\(topic)에 대해 \(language)로 말합니다")
    }
    // 이니셜라이저 요구 준수
    init(topic: String, language: String) {
        self.topic = topic
        self.language = language
    }
}

// 아래로도 채택 가능
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
    }
}

4. 프로토콜 상속

  • 프로토콜은 하나 이상의 프로토콜을 상속가능
  • 다중상속 가능
protocol ProtocolName: ParentProtocl1, ParentProtocol2, .. {
	code
}

// 예시
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")
    }
}

5. 클래스 상속과 프로토콜 상속

  • 클래스 상속에서 프로토콜을 채택할 경우
  • 클래스를 먼저 명시하고 그 뒤에 프로토콜 목록을 작성
class SuperClass: Readable {
    func read() { }
}
class SubClass: SuperClass, Writeable, ReadSpeakable {
    func write() { }
    func speak() { }
}

6. 프로토콜 준수 확인

  • is, as 연산자를 사용하여 확인
let sup: SuperClass = SuperClass()
let sub: SubClass = SubClass()

var someAny: Any = sup


someAny is Readable // true
someAny is is ReadSpeakable // false

someAny = sub

someAny is Readable // true
someAny is is ReadSpeakable // true

someAny = sup

if let someReadable: Readable = someAny as? Readable {
	someReadable.read()
}
// read 

if let someReadSpeakable: ReadSpeakable = someAny as? ReadSpeakable {
    someReadSpeakable.speak()
} // 동작하지 않음

someAny = sub

if let someReadable: Readable = someAny as? Readable {
    someReadable.read()
} // read
profile
Wooyo의 개발 블로그

0개의 댓글