정의
만 해준다.프로토콜에 선언된 프로퍼티나 메소드의 형식
이 명세에 맞춰 실질적인 내용을 작성하는 것
프로토콜을 상속받는 구조체나 클래스에서 구현한다.
상속은 종적인 개념이라면 프로토콜은 횡적인 개념이다.
(대상 클래스 전체를 책임지는 것이 아니고, 단지 몇 가지 기능의 형식만 담당하기 때문)
class Bird {
var isFemale = true
func layEgg(){
if isFemale {
print("새는 둥지에 알을 낳는다!")
}
}
func fly(){
print("새가 하늘에서 날개를 퍼덕이며 날아간다!")
}
}
class Eagle: Bird {
func soar() {
print("독수리는 바람을 타고 솟아오른다!")
}
}
class Penguin: Bird {
func swim(){
print("펭귄은 물장구 치며 수영한다!")
}
}
class Airplaine: Bird {
func override fly(){
print("비행기는 엔진으로 하늘을 난다!")
상속을 받게 되는 경우 하늘을 나는 펭귄
, 수영하는 독수리
, 알을 낳는 비행기
가 탄생하게 된다...
protocol CanFly {
func fly() // 구현을 하지 않는다 (중괄호 들어오면 안됨)
}
class Bird {
var isFemale = true
func layEgg(){
if isFemale {
print("새는 둥지에 알을 낳는다!")
}
}
}
class Eagle: Bird, CanFly {
func fly() { // fly()구현을 프로토콜에서 하지않고 여기서 해준다
print("독수리는 날개짓을 하며 하늘을 난다.")
}
func soar() {
print("독수리는 바람을 타고 솟아오른다!")
}
}
class Penguin: Bird {
func swim(){
// 이제 Bird Class에 fly()함수가 없고,
// CanFly 프로토콜을 상속받지 않았으므로 하늘을 나는 펭귄은 더 이상 존재하지 않을 수 있다!!
print("펭귄은 물장구 치며 수영한다!")
}
}
struct Airplane: CanFly {
func fly() {
print("비행기는 엔진을 이용해 하늘을 난다!")
}
// 이제 비행기도 더 이상 알을 낳지 않고 날기만 한다!
}
protocol MyProtocol {
// Define requirements
}
struct MyStruct: MyProtocol {}
class MyClass: MyProtocol {}
struct MyStructure: FistProtocol, AnotherProtocol {
// 구조체 정의
}
class MyClass: SuperClass, FirstProtocol, AnotherProtocol {
// 부모클래스 먼저 쓰고 이후에 프로토콜 쓰기
}