프로토콜은 특정 기능 수행에 필수적인 요소를 정의한 청사진입니다.
프로토콜을 만족시키는 타입을 '프로토콜을 따른다'고 표현할 수 있습니다.
또한 프로토콜은 필수 구현 및 기능 추가를 위해 확장이 가능힙니다.
프로토콜의 요구사항을 충족시키려면,
프로토콜이 제시하는 정사진의 기능을 모두 구현해야 합니다.
즉, 프로토콜은 기능을 정의하고 제시만 할 뿐 구현된 상태는 아닙니다.
java의 interface와 굉장히 유사한데 몇가지 차이가 있습니다.
프로토콜은 초기값 지정이 불가능하고 static이 사용 가능하며
옵셔널로 선언된 멤버는 구현을 안해도 된다는 점이 차이입니다.
구현
protocol Weapon {
var name: String { get, set }
var type: String { get }
var damage: Int { get set }
init(weaponType: String, damage: Int)
func explanation()
}
블럭안에 get, set을 명시함으로써 읽고 쓰기의 가능여부를 설정할 수 있습니다.
채택 및 준수
import Foundation
protocol Weapon {
var name: String { get set }
var type: String { get set }
var damage: Int { get set }
init(name: String, type: String, damage: Int)
func explanation()
}
struct CommonWeapon : Weapon {
var name: String
var type: String
var damage: Int {
set {
self.damage = newValue
}
get {
return self.damage
}
}
init(name: String, type: String, damage: Int){
self.name = name
self.type = type
self.damage = damage
}
func explanation(){
print("[\(name)] 타입: \(type) 공격력: \(damage)")
}
}
프로토콜 상속
클래스의 상속문법과 유사하지만, 프로토콜은 다중상속이 가능합니다.
protocol Clickable{
func click()
}
protocol Dragable{
func drag()
}
protocol Scrollable{
func scroll()
}
protocol WindowGUI: Clickable, Dragable, Scrollable {
func microsoft()
}
struct someSturct: WindowGUI{
func click(){ print("click") }
func drag(){ print("drag") }
func scroll(){ print("scroll") }
func microsoft(){ print("microsoft") }
}
클래스 상속과 프로토콜
클래스가 상속과 프로토콜을 동시에 하려면,
상속받을 클래스를 먼저 명시한 후에 프로토콜 목록을 작성하면 됩니다.
class Super: Clickable{
func click(){ print("click") }
}
class Sub: Super, Dragable, Scrollable{
func drag(){ print("drag") }
func scroll(){ print("scroll") }
}
프로토콜 준수 확인
is, as 연산자로 인스턴스가 프로토콜을 준수하는지 확인할 수 있습니다.
let super: Super = Super()
let sub: Sub = Sub()
var someAny: Any = sup
someAny is Clickable // true
someAny is Dragable // false
someAny is Scrollabl // false
if let temp: Clickable = someAny as? Clickable{
temp.click()
} // click
if let temp: Dragable = someAny as? Dragable{
temp.drag()
} // 미작동
somAny = sub
someAny is Clickable // true
someAny is Dragable // true
someAny is Scrollabl // true
if let temp: Dragable = someAny as? Dragable{
temp.drag()
} // darg
이 외어도 방대한 양의 자료가 있으니... 궁금하신분들은 아래 링크 가보시면 되겠습니다.
공부에 도움이 된 사이트
전반적인 공부 가이드라인
https://yagom.net/courses/swift-basic/lessons/타입-확장/topic/프로토콜/
공식 스위프트 가이드 번역사이트
https://jusung.gitbook.io/the-swift-language-guide/language-guide/21-protocols
프로토콜과 인터페이스 차이
dongkyprogramming.tistory.com/11
'Language > Swift' 카테고리의 다른 글
Swift 오류처리 (0) | 2021.03.15 |
---|---|
Swift 익스텐션 (Extensions) (0) | 2021.03.15 |
Swift Assert와 Guard (0) | 2021.03.14 |
Swift 타입캐스팅 (형변환) (0) | 2021.03.13 |
Swift 인스턴스의 생성과 소멸 (0) | 2021.03.12 |