-
Swift - Protocol InheritanceProgramming/Swift 2022. 1. 2. 12:24
안녕하세요 BeePeach입니다 :>
오늘은 Protocol의 Inheritance(상속)에 대해서 공부를 해보려고 합니다.
Class의 특징 중에 하나는 상속이 가능하다는 점이었습니다.
Protocol도 class와 비슷하게 상속이 가능합니다.
그럼 Protocol에서 상속을 어떻게 사용하는지 같이 공부해보도록 하겠습니다.
Protcol Inheritance
Protocol의 상속은 class의 상속과 문법이 똑같습니다.
다만 차이점은 protocol 상속은 여러 개의 protocol 상속이 가능합니다.
여러 개를 상속할 때는 , (comma)로 구분해주면 됩니다.
어려울 부분이 없으므로 바로 예제를 보겠습니다.
Readable과 Writable 프로토콜을 선언하고 이를 동시에 상속하는 TextFile이라는 프로토콜을 선언했습니다.
그리고 TextFile을 채용하는 CustomFile class를 선언했습니다.
이렇게 되면 CustomFile에는 title 프로퍼티만 구현해야 하는 게 아니라 Readable, Writable을 상속받았기 때문에 read(), write() 메서드도 필수적으로 구현해야 합니다.
만약 title만 구현하고 나머지를 구현하지 않는다면 요구사항을 만족하지 못했다는 에러를 확인할 수 있습니다.
Class Only Protocol
Protocol의 상속을 이용하는 방법 중에 해당 protocol을 class에서만 채용 가능하도록 하는 방법이 있습니다.
바로 AnyObject 또는 class 프로토콜을 상속하는 방법입니다.
둘의 차이점은 없습니다.
이전에는 class를 사용해도 경고가 나오지 않았는데 지금은 class를 사용하면 AnyObject를 사용하라는 문구가 추가됐습니다.
그러니 AnyObject를 사용하도록 합시다!
위의 예시를 보면 ClassOnlyProtocl은 AnyObject를 상속하고 있습니다.
그리고 이 프로토콜을 SomeStruct라는 구조체에서 채용하려고 하니 에러가 발생하는 것을 확인할 수 있습니다.
Non-class Type이 class protocol을 채용하려고 한다는 에러를 확인할 수 있습니다.
Protocol Conformance
이제 Protocol Conformance, 즉 Type이 프로토콜을 채용하고 있는지 아닌지를 확인하는 방법에 대해서 공부해보겠습니다.
어떠한 Type이 프로토콜을 채용하고 있는지 아닌지는 is와 as연산자를 이용합니다.
예전 포스팅에서 잠깐 다룬 적이 있는 TypeCasting Operator입니다.
is로 type check를 하고 as로 type check를 하면서 해당 타입으로 캐스팅시킵니다.
- is 연산자는 인스턴스가 해당 프로토콜을 채용하고 있다면 true를 아니라면 false를 리턴합니다.
- as? 연산자는 Optional 값을 리턴합니다. 인스턴스가 프로토콜을 채용하고 있지 않는다면 nil을 리턴합니다.
- as! 연산자는 인스턴스가 프로토콜을 채용하고 있지 않는다면 runtime error가 발생합니다.
is 연산자의 예시를 보면 CustomFile은 Readable, Writable을 상속하고 있었죠??
그래서 myFile 인스턴스는 세 가지 프로토콜을 모두 채용하고 있으므로 true가 리턴됩니다.
하지만 Repeatable이란 프로토콜은 채용한 적이 없으므로 false가 리턴되는 것을 확인할 수 있습니다.
as?는 바로 이전 포스팅에서 맨 마지막에 예제로 다뤄봤습니다.
as?를 이용해서 binding을 시킨다면 해당 프로토콜의 요구 멤버에 접근할 수 있는 안정성이 보장이 됩니다.
위 예제에서는 Readable, Writable, Playable 프로토콜을 각각 채용하는 새로운 class를 선언하고 각각의 인스턴스를 생성했습니다.
모두 다른 Type이지만 class이므로 AnyObject 배열에 담을 수 있죠??
이렇게 AnyObject로 담으면 Type의 안정성을 보장할 수 없으므로 각각의 멤버에 접근할 수 없습니다.
하지만 여기서 as?를 이용해서 Playable로 캐스팅 시키고 만약 바인딩에 성공해서 만들어진 상수 vedio는 Playable이라는 프로토콜을 채용하고 있고 안정성을 보장받으므로 play() 메서드에 접근할 수 있습니다.
참고자료
https://docs.swift.org/swift-book/LanguageGuide/Protocols.html
Protocols — The Swift Programming Language (Swift 5.6)
Protocols A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of tho
docs.swift.org
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Protocol Optional Requirement (0) 2022.01.04 Swift - Protocol Composition (0) 2022.01.03 Swift - Protocol as Type (0) 2021.12.29 Swift - Protocol Initializer , Subscript (0) 2021.12.28 Swift - Protocol (0) 2021.12.22