Procotol
위키백과
-
통신 프로토콜은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 **
규칙
의 체계이다.**
예시
swift
프로토콜은 규칙
을 표현한다는 점에서 비슷하지만 조금 다른 의미로 사용된다.
내가 좋아하는 yagom 은 명찰
,공고
를 통해 이야기를 해주었다.
프로토콜은 일종의 명찰이다 .
어떤 클래스(구조체)가 특정 프로토콜을 채택
하게되면 프로토콜이 요구하는 사항들을 준수
해야한다. 따라서 특정프로토콜을 구현한 클래스를 통해 생성된 오브젝트는 해당 프로토콜에서 요구되는 능력들을 수행할 수 있음을 신뢰할 수 있다.
struct Patient {
let helper : Any
}
let 부엉이 = String()
let 환자 = Patient(helper: 부엉이)
한 환자가 있습니다. 환자는 자신을 치료해줄 사람이 필요합니다. 위와 같이 Any
타입의 부엉이는 부적절합니다. 자신을 치료해줄 능력이 있는 객체를 원하고있으니까요.
protocol Healable{
var 착한마음씨 : String { get }
func heal()
}
이렇게 프로토콜로 하나의 책임을 만들었습니다.
치료를 하기위해선 착한마음씨를 가져야하고, 치료를 할수 있어야합니다.
struct Patient {
let helper : Healable
}
Patient
구조체를 그에 맞게 수정하겠습니다. helper
는 Healable
프로토콜을 준수하면 누구나 상관없습니다.
struct Nurse : Healable{
var 착한마음씨: String
func heal() {
print("주사로 치료합니다")
}
}
struct Doctor : Healable {
var 착한마음씨: String
func heal() {
print("수술로 치료합니다.")
}
}
struct Grandma: Healable {
var 착한마음씨: String
func heal(){
print("약손으로 치료합니다")
}
}
각각의 구조체들로 생성된 인스턴스들은 다른 방식으로 heal
동작을 수행하지만 heal
이라는 동작은 모두 해야합니다.
그럼 환자는 위의 구조체로 생성된 어느 인스턴스라도 helper
로서의 자격이 있기에 치료받을수있겠네요.
소프트웨어에 객체들을 표현함에 있어서 , 사물이 있을 수 있고 , 사물이 할 수 있는 역할을 표현 할 경우도 있다. 특정 역할을 표현하고 , 그것에 만족하는 객체만 필요로 하는 경우가 있습니다. 또 유연하게 그 역할을 할수있으면 누구나 가능하게끔 유연하게 프로그래밍을 짜기위해서 프로토콜
은 아주 적잘한 선택일거 같습니다.
문법 팁
- & 로 여러 프로토콜을 요구하는 변수를 선언할수있다
let 의사 : Healable & Careable
- 여러 프로토콜을 채택한 경우 프로토콜간의 변수의 타입이 다르면 충돌이 날 수 있습니다.
- 가이드 라인을 준수하여 , 명사로 표현 / 기능을 나타내는 프로토콜
-able,-ible,-ing
접미사 추가protocol Healable { let 착한마음씨:String func heal() } protocol Careable{ let 착한마음씨:Int func heal()->(Any) } struct 의사 :Healable,Careable{ // 충돌 }