[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
반응형
'컴퓨터언어 > Swift' 카테고리의 다른 글
[Swift] Extension : 원래 있던 class/struct에 커스텀 기능추가하기 (0) | 2020.04.13 |
---|---|
[Swift] 함수에 인수가 뭐이리 많아? _ 는 무엇? (feat. Parameter vs Argument) (0) | 2020.04.12 |
[Swift 고급] Protocol X Delegate : 코드 리팩토링과 파일 간 데이터 전송의 끝판왕 (0) | 2020.04.12 |
[Swift] Computed Property : 생성자에 없어도 자동생성 해주는 변수 (0) | 2020.04.12 |
[Swift] Closure : 함수 안에 함수 (0) | 2020.04.11 |