[Swift] (기초) Protocol / 프로토콜
2021. 9. 1. 21:02ㆍ🍏/Swift 기초 공부
- 프로토콜은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의합니다.
- 구조체, 클래스, 열거형은 프로토콜을 채택 해서 특정 기능을 수행하기 위한 프로토콜의 요구사항을 실제로 구현 할 수 있습니다.
- 어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 프로토콜을 준수한다고 표현합니다.
- 타입에서 프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 청사진의 기능을 모두 구현해야합니다. 즉 프로토콜은 기능을 정의하고 제시 할 뿐이지 스스로 기능을 구현 하지는 않습니다.
/*프로토콜*/
//프로토콜은 특정 역할을 수행하기 위한
//메서드, 프로퍼티, 이니셜라이저 등의 요구사항을 정의합니다.
//구조체, 클래스, 열거형은 프로토콜을 채택(Adopted)해서 프로토콜의 요구사항을 실제로 구현할 수 있습니다.
//어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 '프로토콜을 준수한다(Conform)' 고 표현합니다.#column
//프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 기능을 모두 구현해야 합니다.
//protocol name{
// define
//}
protocol Talkable {
//프로퍼티 요구
// 프로퍼티 요구는 항상 var 키워드를 사용합니다
// get은 읽기만 가능해도 상관 없다는 뜻이며
// get과 set을 모두 명시하면
// 읽기 쓰기 모두 가능한 프로퍼티여야 합니다.
var topic: String { get set }
var language: String { get }
//메서드 요구
func talk()
//이니셜라이저 요구
init(topic: String, language: String)
}
// - 프로토콜 채택 및 준수
// 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
}
}
// 프로토콜 상속
// 프로토콜은 클래스와 다르게 다중상속이 가능합니다
//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() {print("read")}
}
class SubClass: SuperClass, Writeable, ReadSpeakable{
func write() { print("write") }
func speak() { print("speak") }
}
// 프로토콜 준수 확인
//인스턴스가 특정 프로토콜을 준수하는지 확인할 수 있습니다
//is, as 연산자 사용
let sup: SuperClass = SuperClass()
let sub: SubClass = SubClass()
var someAny: Any = sup
someAny is Readable // true
someAny is ReadWriteSpeakable
someAny = sub
someAny is Readable
someAny is ReadSpeakable
someAny = sup
if let someReadable: Readable = someAny as? Readable {
someReadable.read()
}
if let someReadSpeakable: ReadSpeakable = someAny as? ReadSpeakable {
someReadSpeakable.speak()
}
someAny = sub
if let someReadable: Readable = someAny as? Readable{
someReadable.read()
}
// 딕셔너리에서 꺼내온다거나 Any타입으로 받아 왔다거나. 사용함
// 프로토콜이 가지는 의미. 구현하는 입장, 프로토콜의 입장에서 보게되면 너는 이것을 꼭 구현해야한다.라고 강요 받을수 있지만
// 사용하는 사람입장에서의 프로토콜은 타입의 인스턴스를 만들어서 사용하는 사람의 입장에서 보면
// 이 타입은 이 프로토콜을 준수하고 있기 때문에 이런이런 기능을 다 수행할수 있겠구나 하는 것을 좀더 명확히 알 수 있고, 컴파일러 또한 그런 기능을 갖고 있는지 알 수 있다.
// 그러므로 컴파일러는 이런이런것들을 요청 할 수 있다. 라고 볼 수 있다. (프로토콜의 의미)
'🍏 > Swift 기초 공부' 카테고리의 다른 글
[Swift] (복습) Struct & Class / 구조체 & 클래스 (0) | 2022.09.01 |
---|---|
[Swift] (기초) Extension / 익스텐션 (0) | 2021.09.11 |
[Swift] (기초) Assert & Guard / Assertion / Early Exit / Guard (0) | 2021.09.01 |
[Swift] (기초) Type Casting / 타입 캐스팅 / 다운 캐스팅 / 업 캐스팅 (0) | 2021.09.01 |
[Swift] (기초) Optional Chaining / 옵셔널 체이닝 (0) | 2021.08.28 |