protocol

컴퓨터공부/iOS 2020. 11. 21. 16:19 Posted by 아는 개발자

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
protocol  (0) 2020.11.21
Delegate  (0) 2020.11.21
TAG ,