밤에 쓴 코드

Swift) 프로토콜 - Protocol 본문

Swift

Swift) 프로토콜 - Protocol

붱이🦉 2019. 4. 11. 14:11

프로토콜

위키백과

  • 통신 프로토콜은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 **규칙 의 체계이다.**

예시

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구조체를 그에 맞게 수정하겠습니다.
helperHealable프로토콜을 준수하면 누구나 상관없습니다.


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{
        // 충돌
        }

'Swift' 카테고리의 다른 글

Swift) POP - Protocol Oriented Programming  (1) 2019.04.25
Swift) Extension - 익스텐션  (0) 2019.04.25
Swift) 옵셔널 - Optional  (0) 2019.04.18
Swift) 구조체/변수/상수  (0) 2019.04.08
Swift) 열거형 - Enumeration  (0) 2019.04.05
Comments