[Swift] Protocol

2020. 4. 10. 15:23컴퓨터언어/Swift

728x90
반응형

안젤라 유님의 강의를 듣고 나름 정리해 보았다.

Protocol은 사용할 함수를 Body 부분 없이 이름만 추상화시켜놓은 다음,

해당 함수를 실제로 구체화해서 사용할 Class나 Struct에서 위임받아 사용할 수 있다.

 

아래 예는 유데미에서 안젤라 유님이 CPR을 행하는 과정을 예로 설명하신 것이다.

강의에서는 CPR을 행할 수 있는 능력을 protocol로 사전 설정해 놓고, 각기 다른 직업의 사람들이 어떻게 사용하는지 살펴보았다.

// 이것은 CPR 자격증이다. 이 자격증을 가진(=":AdvancedLifeSupport"를 뒤에 적은) 사람들(=class/struct)은 performCPR을 할 수 있다.
protocol AdvancedLifeSupport {
    // CPR을 행할 수 있는 능력
    func performCPR()
}

// 응급콜센터 직원에 관한 규칙 : 우리는 CPR을 행할 수 있는 사람들에게 곧바로 출동할 수 있도록 빨리 연락을 한다.
// UITextField에 해당
class EmergencyCallHandler {
    
    // 자기 자신을 delegate로 정의하는 클래스나 스트럭트 모두 이 delegate 변수를 프로퍼티로 가져야 한다.
    // CPR 자격증 취득자에 한해서만 delegate를 선언할 수 있다.
    var delegate: AdvancedLifeSupport?
    
    // 콜센터 직원의 할일 : 119 신고를 받고 환자에게 무슨 일인지 물어보기
    func assessSituation() {
        print("Can you tell me what happend?")
    }
    
    // 콜센터 직원이 환자와 통화하다가 보니까 매우 응급상황인 경우 취하는 행동
    func medicalEmergency() {
        // CPR 가능한 사람은 이 알람을 듣고 CPR을 행해주세요
        delegate?.performCPR()
    }
}

// CPR 자격증 취득자에 관한 규칙 : 우리는 응급콜센터로부터 신고접수를 받아 CPR 출동을 한다.
struct Paramedic: AdvancedLifeSupport {
    
    // CPR 자격증을 취득한 순간, 응급상황 때마다 나에게 직접 연락을 해줄 콜센터 직원(=handler 인수)이 배정된다.
    init(handler: EmergencyCallHandler) {
        // 취득자 자신(=self)은 콜센터 직원(=handler 인수)으로부터 언제나 응급상황 출동에 대한 notification을 듣고 있음을 서약합니다 ^^7
        handler.delegate = self
    }
    
    // 취득자의 능력
    func performCPR() {
        print("Paramedic Execute CPR.")
    }
    
}

// 콜센터에서 근무중인 직원 emilio 씨.
let emilio = EmergencyCallHandler()

// pete씨는 CPR 자격증을 땄고, emilio씨가 응급상황때마다 알람을 줄 것이라고 안내받았다.
let pete = Paramedic(handler: emilio)

// 어느 날, emilio씨에게 119 신고가 들어왔다. 환자와 통화하는 emilio씨. - 무슨 일이신가요?
emilio.assessSituation()
// emilio는 응급상황임을 판단하고 CPR 자격증 취득자인 pete를 출동시켰다.
emilio.medicalEmergency()
/*
Can you tell me what happend?
Paramedic Execute CPR.
Program ended with exit code: 0
 */


// 추가로, 의사들 역시 CPR을 할 수 있기에 Doctor 클래스도 CPR 자격증을 부여한다.
class Doctor: AdvancedLifeSupport {
    
    // 의사도 Paramedic처럼 콜센터로부터의 신고접수를 들을 수 있음.
    init(handler: EmergencyCallHandler) {
        handler.delegate = self
    }
    
    // 의사의 CPR
    func performCPR() {
        print("A Doctor perfoms CPR.")
    }
    
    // 의사의 청진기 다루기 능력
    func useStethoscope() {
        print("Listen to heartbeat.")
    }
}

// 의사들 중 외과의사
class Surgeon: Doctor {
    
    // 의사 중에서도 외과의사는 CPR을 하며 노래도 부를 수 있는 경지.
    override func performCPR() {
        super.performCPR()
        print("Surgeon even sing a song.")
    }
}

// ben은 외과의사이다.
let ben = Surgeon(handler: emilio)

// 정리 : emilio가 신고접수를 받으면, CPR 자격증 보유자 모두에게 연락이 간다.
emilio.medicalEmergency()
/*
 Can you tell me what happend?
 Paramedic Execute CPR.
 A Doctor perfoms CPR.
 Surgeon even sing a song.
 Program ended with exit code: 0
 */

 

728x90
반응형