요번에 배울 것은 POP(Protocol Oriented Programming)
프로토콜 지향 프로그래밍
import Foundation
protocol Talkable{
var topic: String{ get set}
func talk(to: Self)
}
struct Person: Talkable{
var topic: String
var name: String
func talk(to: Person){
print("\(topic)에 대해 \(to.name)에게 이야기합니다")
}
}
struct Monkey: Talkable{
var topic: String
func talk(to: Monkey){
print("우끼끼 꺄꺄 \(topic)")
}
}
import Foundation
protocol Talkable{
var topic: String{ get set}
func talk(to: Self)
}
//익스텐션을 사용한 프로토콜 초기 구현
extension Talkable{
func talk(to: Self){
print("\(to)! \(topic)")
}
}
struct Person: Talkable{
var topic: String
var name: String
}
struct Monkey: Talkable{
var topic: String
}
let ned = Person(topic: "Swift", name: "ned")
let hana = Person(topic: "Internet", name: "hana")
ned.talk(to: hana)
hana.talk(to: ned)
프로토콜이 요구하는 사항을 미리 모두 한꺼번에 구현해 둘 수 있따면 중복된 코드를 피할 수 있다.
이 코드에서는 Person과 Monkey에 Talkable의 요구사항인 talk(to:)메서드를 구현하지 않았음에도 전혀 오류가 발생하지 않는다.
이렇게 하나의 프로토콜을 만들어 두고, 초기 구현을 해둔다면 여러 타입에서 해당 기능을 사용하고 싶을 때 프로토콜을 채택하기만 하면 된다.
만약에 프로토콜 초기 구현과 다른 동작을 행한다면, 그저 그 타입에 프로토콜의 요구사항을 재정의해주면 된다.
Monkey에다가 talk함수를 재구현하면 됨. 여기서는 오버라이드 개념을 쓰지 않음!!
프로토콜 초기 구현을 잘 해둔다면 여러 프로토콜을 그저 채택하기만 하면 그 타입에 기능이 추가된다.
대문자 Self는 타입 자체를 정의할 때 사용하고, 소문자 self는 타입의 객체를 의미한다
프로토콜에서의 Self는 자기 자신을 채택하는 “타입 자체”를 의미한다.
정리하면,
주의할 점