본문 바로가기

iOS_Study

[Swift] Delegate & Protocol (1) - Protocol이란?

 안녕하세요! devDonghyun입니다.

 

Swift 첫 포스팅은

1. 비유를 통해 Delegate & Protocol 에 대해 알아보기
2. Protocol 이란? (Delegate Pattern이 Protocol로 구현되기 때문입니다!)

 

 앞으로 계속해서 쓰일 개념이라 생각하여 조금은 시간을 들여 공부를 진행했습니다.

그 내용을 블로그에 잘 정리해보고자 합니다.

 

 

강의 자료는 Udemy 사이트의
Angela Yu, Complete iOS App Development Bootcamp로
학습하였습니다.

사진 자료의 출처는 모두 Udemy, Angela Yu에 있음을 알립니다.

 

 비유로 시작하는 Delegate와 Protocol


 

Delegate는 Protocol로 구현되기 때문에 둘을 함께 설명하도록 하겠습니다.

 

 

119가 긴급 전화를 처리하는 과정으로 비유해서 알아가봅시다!

 

 

 긴급 전화가 걸려오면 그걸 받아서 처리하는 사람을 EmergencyCallHandler 클래스라고 생각해봅시다.

그리고, 여기 119는 조금 특별합니다.

 옛날에 자주 쓰이던 삐삐를 쓰고 있기 때문이죠.

긴급 전화가 걸려오면 EmergencyCallHandler가 원격으로 삐삐를 작동시켜 주변에 심장마비가 발생한 환자가 있으니

누가 가서 심폐소생술을 진행해야 한다고 알릴 수 있습니다.

 

 여기서 삐삐Delegate Property가 됩니다.

구급대원(Delegate)이 누가 되던지 간에 언제 응급 처치를 진행해야 하는지 알림을 받을 속성입니다. 

 

 이제 EmergencyCallHandler는 누가 구급대원(Delegate)이 되던지 상관하지 않아도 됩니다.

그 대신, 삐삐 신호를 받아서 처리하는 사람은 꼭 응급구조사 자격증(Protocol)을 가진 사람이어야 합니다.

응급구조사 자격증을 보유하고 있다는 말은 심폐소생술(Protocol Method)을 할 수 있는 사람임을 의미하는 거겠죠?

 

 

 근무지의 설정이 모두 끝나고

다음날 근무가 시작되었습니다.

 

 

 오늘의 구급 대원은 홍길동입니다.

응급 전화를 받은 EmergencyCallHandler가 삐삐로 신호를 보내면,

삐삐에는 구급 대원이 심폐소생술을 해줘야 할 사람의 위치가 표시됩니다.

 

 홍길동 구급 대원은 그 메시지를 보고 심폐소생술을 하러 바로 출발하는 것이죠.

 

 이 방법의 장점은 구급 대원이 꼭 홍길동이 아니라도 된다는 것입니다.

누구든지 응급구조사 자격증(Protocol)을 가진 사람이라면 홍길동이 한 역할을 똑같이 수행할 수 있는 것이죠.

이 순간에도 EmergencyCallHandler는 심폐소생술을 실시할 사람이 누가 되던지 상관을 안 쓰고 있답니다.

그럴 필요가 없기 때문이죠. 

 

 

.

.

.

.

.

.

.

...?

 

 Swift의 Delegate 패턴에 대해 처음 접하거나, 아직 이해하지 못하신 분은

이 비유를 이해하기 어려울 수도 있습니다.

 

 

 

날씨 앱을 만들며 써보는 Delegate & Protocol


 

지금부터는 실제 코드를 보면서 앱에서 어떻게 사용되는지 보도록 합시다.

 

 특정 도시의 이름을 검색하면 그 도시의 날씨를 알려주는 앱을 만든다고 생각해봅시다.

 

 Apple은 우리에게 UITextField 클래스(사용자 입력과 관련된 클래스)를 탬플릿으로 제공해줍니다.

사용자가 탭할 때 발생해야 하는 작업, 사용자 터치 감지 등의 Property Method를 우리에게 만들어 주었습니다.

 

 그런데, 날씨 앱을 만들면서 우리만의 Custom ClassWeatherViewController를 만든다고 생각해봅시다.

사용자가 TextField에 입력을 시작할 때 쓰여질 특정 기능을 넣고 싶어졌습니다.

 

 

 그래서 우리는 Apple이 제공한 UITextField 클래스 정의 안에 WeatherViewController 객체를 만들어야 합니다.

//UITextField
//properties...
//methods....

let weatherVC = WeatherViewController()
weatherVC.textFieldDidBeginEditing()

 

음... 이렇게 하면 우리가 원하는 기능은 얻을 수 있습니다.
당장은 말이죠

 

 

 하지만, 우리가 앱을 만들면서 더 많은 사용자 정의 클래스들을 생성하면 어떡하죠?

그때마다 UITextField에 객체를 생성할 수는 없습니다...

 

 

🙌 나중에 우리가 정의할 클래스가 뭔지 모르더라도 TextField를 계속해서 재사용할 수 있었으면 좋을 듯 합니다. 🙌

 

 

 

그 해결책이 바로 Delegate Pattern입니다! 👍

 

 

 

Protocol이란?


Delegate Pattern의 전체 과정 설명에 앞서

Delegate Pattern을 구현하기 위한 Protocol에 대해 짚고 넘어가겠습니다.

 

 

 위의 비유에서 응급구조사 자격증(Protocol)을 기억하시나요?

Protocol은 마치 자격증과 같습니다.

구조체, 클래스 등이 Protocol을 채택해서, Protocol이 요구하는 사항구현해야 하기 때문이죠,

 

// Protocol 정의

protocol MyProtocol {
	// 여기에 요구사항을 정의하면 됩니다!
}
// Protocol 채택
struct MyStruct: MyProtocol{}
class Myclass: Myprotocol{}

 

 

 

 

 채택과 구현.

보통이면 클래스의 상속으로 코드를 구성했을 것입니다.

 

'새'라는 클래스를 만든다고 생각해봅시다.

'새' 클래스에는 '날 수 있음(CanFly)' Method를 만들었습니다.

 

 '독수리''펭귄'을 모두 '새' 클래스의 SubClass로 만들었습니다.

하지만, 펭귄이 날 수 있던가요...? 😂

펭귄은 날 수 없는데 '새' 클래스의 subClass 라서 CanFly 메소드를 쓸 수 있게 되버렸습니다.

 

이번에는 '비행기' 클래스가 갑자기 필요해져서 만들었습니다.

'비행기'는 날 수 있기에 '새' 클래스의 CanFly 메소드를 쓰고 싶어졌습니다. 

하지만, '비행기'는 새가 아닙니다... 🤣

펭귄은 날 수 있지만 비행기는 날지 못하는 어처구니 없는 상황이 벌어졌네요.

 

 

 하지만 CanFly라는 Protocol을 정의한다면 어떨까요?

protocol CanFly {
	func fly() // 구체적인 구현은 여기서 하지 않습니다!!!
}

 fly 메소드가 필요한 클래스에서만 CanFly Protocol을 채택해서 쓸 수 있습니다.

이제 '독수리'와 '비행기'는 날 수 있고, '펭귄'은 날 수 없습니다.

fly() 메소드가 필요한 곳에서만 CanFly Protocol채택해서 쓸 수 있는 것입니다.

fly() 메소드'독수리''비행기' 클래스 내에서 구현하면 됩니다. -> 무조건 구현해줘야 에러가 안 나요 ✔

struct MyStructure: FirstProtocol, AnotherProtocol {
	// 여기에 구조체 정의하기
}

class Myclass: SuperClass, FirstProtocol, AnotherProtocol {
	// 여기에 클래스 정의하기
}

 

 이제 Protocol이 무엇인지에 대해서는 개념이 잡혔으리라 믿습니다.

 

 

그럼, 다음 포스팅에서는 TextField를 재사용할 수 있도록 도와주는 Delegate Pattern이 정확히 무엇인지,
Delegate Pattern이 어떻게 Protocol로 구현되는지에 대해서 알아보도록 하겠습니다. 

'iOS_Study' 카테고리의 다른 글

[Swift] Delegate & Protocol (2) - Delegate Pattern  (4) 2021.10.04