ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • protocol
    개발/iOS 2020. 11. 21. 16:19

    protocol은 네트워크나 의전에서 주로 쓰이는 용어인데 swift에서는 네트워크와 의전에서 사용되는 의미랑은 조금 다른 차원인 것 같고 차라리 자바나 코틀린에서 사용하는 interface가 좀더 와닿는 느낌이며 실제로도 비슷한 역할을 한다(자바 개발자를 너무 오래해서 그런가). 이 포스트에서는 객체 지향적 관점에서 protocol을 왜 사용해야하는지를 설명하기 보다는 어떻게 쓰는지를 중점적으로 설명하고자 한다.

     

    protocol은 delegate 패턴을 쓸 때 사용하는 타입이다. delegate 패턴을 사용하는 예제 코드를 통해 protocol을 살펴보자.

     

    protocol AdvancedLifeSupport {
        func performCPR()
    }
    
    class EmergencyCallHandler {
        var delegate: AdvancedLifeSupport?
        
        func assessSituation() {
            print("Can you tell me what happened?")
        }
        
        func medicalEmergency() {
            delegate?.performCPR()
        }
    }

     

    EmegencyCallHandler는 위급 상황을 평가하는 함수(assessSituation) 와 처리하는 함수(medicalEmergency)를 갖고 있는데 처리하는 작업은 다른 클래스에서 작업을 위임하고 있다. 위임할 때 호출하는 변수인 delegate는 AdvancedLifeSupport 라는 프로토콜 타입의 클래스로 선언돼있다. 

     

    AdvanceLifeSupport protocol을 보면 performCPR() 함수만 있고 내부의 body는 구현되지 않았다. 이 함수는 이 명령을 위임 받을 클래스에서 반드시 구현해야 하는 내용이다.

     

    class Doctor: AdvancedLifeSupport {
        func performCPR() {
            print("The doctor does chest compressions, 30 per second.")
        }
        
        init (handler: EmergencyCallHandler) {
            handler.delegate = self
        }
    }
    
    let handler = EmergencyCallHandler()
    let doctor = Doctor(handler: handler)
    
    handler.assessSituation()
    handler.medicalEmergency()

     

    Doctor 클래스에서는 AdvancedLifeSupport protocol을 구현하고 있다. body만 빠져 있던 performCPR 함수에 Doctor 클래스에서 처리하고 있다는 내용이 담긴 로그를 남기고 있다. 이 함수를 구현하지 않으면 컴파일 에러가 뜬다. 이 함수를 위임 받았으니, 해당하는 작업을 처리하라는 뜻이다.

     

    아래 클래스에서 EmergencyHandler와 Doctor 클래스를 각각 초기화하고 Handler 에서 함수를 호출하면 다음과 같은 콘솔이 뜨는 것을 볼 수 있다. EmergencyHandler에서 작업을 위임 받은 Doctor 클래스에서 선언한 performCPR 함수가 호출되고 있다.

     

     

    '개발 > iOS' 카테고리의 다른 글

    codable  (0) 2020.11.23
    extension  (0) 2020.11.23
    closure  (0) 2020.11.23
    segue  (0) 2020.11.23
    Delegate  (0) 2020.11.21

    댓글

Designed by Tistory.