▶ Delegate가 뭘까?
한 객체가 다른 객체의 행동이나 상태 변화를 대신 처리하도록 위임하는 디자인 패턴이다. 이 패턴은 두 객체 간에 느슨한 결합(의존성을 최소화) 관계를 유지할 수 있게 해주는데, 쉽게 말해 Delegate는 어떤 객체가 스스로 처리할 수 없는 일을 다른 객체에 맡기는 방식을 뜻한다.
▶ 예를 들어보면
당신이 어떤 중요한 일을 해야 한다고 해보자. 그런데 그 일을 당신 혼자 하기 힘들거나 적절하지 않을 때, 친구에게 그 일을 대신 해달라고 부탁할 수 있는데, 이때 당신은 Delegate(위임자)가 되고, 친구는 Delegate(대리자)가 된다.
Swift에서 이런 개념은 주로 이벤트가 발생할 때 그 처리를 위임할 때 사용돼. iOS에서 버튼을 클릭했을 때, 스크롤을 할 때, 네트워크 요청이 완료됐을 때 등을 처리하기 위해 많이 쓰이는데, 직접 코드를 보면서 이해해보자.
▶ Delegate 패턴의 구성 요소
Delegate 패턴을 사용하려면 크게 세 가지가 필요하다.
1. Delegate 프로토콜: 할 일을 규정하는 약속. (예: 친구에게 뭘 해야 하는지 설명하는 것)
2. Delegate 객체: 일을 대신 처리할 객체. (예: 그 일을 실제로 대신 해줄 친구)
3. Delegate 메서드를 호출하는 객체: 그 일을 대신 처리해야 하는 객체. (예: 일을 부탁하는 당신)
▶ Delegate 예제 (친구가 메시지를 보내는 역할을 위임하는 상황)
1. Delegate 프로토콜 정의
친구에게 메시지를 보내달라고 부탁하는 역할이 있다고 생각하고, 이 역할을 규정하는 프로토콜을 만들어보자. (친구에게 메시지를 어떻게 보내야 하는지 정의)
protocol MessageDelegate: AnyObject {
func sendMessage(_ message: String)
}
이 프로토콜은 sendMessage라는 메서드를 요구한다. “너가 이 프로토콜을 채택하면 메시지를 보내야 해!“라는 약속인 셈이다.
2. Delegate 객체(대리자) 구현
이제 이 일을 처리할 친구가 필요하다. 즉, 메시지를 보내는 역할을 맡을 객체인데 한번 만들어보자. 친구가 메시지를 보내는 일을 대신 처리하게 될 것이다.
class Friend: MessageDelegate {
func sendMessage(_ message: String) {
print("친구가 메시지를 보냅니다: \(message)")
}
}
Friend 클래스가 MessageDelegate 프로토콜을 채택하고 sendMessage 메서드를 구현했다. 이제 친구는 메시지를 대신 보낼 준비가 됐다.
3. Delegate를 호출하는 객체(일을 부탁하는 당신)
이제 당신이 그 친구에게 메시지를 대신 보내달라고 부탁하는 코드를 작성해보자.
class You {
weak var delegate: MessageDelegate?
func askFriendToSendMessage() {
delegate?.sendMessage("안녕!") // 친구에게 메시지 보내달라고 부탁함
}
}
You 클래스는 delegate라는 변수를 갖고 있다. 이 변수에 메시지를 대신 보낼 친구(Friend 객체)를 지정할 수 있다. 그 후에 askFriendToSendMessage() 메서드를 호출하면 친구가 메시지를 보내는 것이다.
4. Delegate 설정
이제 당신과 친구를 연결해보자.
let you = You() // 당신
let friend = Friend() // 친구
you.delegate = friend // 당신의 친구로 위임 설정
you.askFriendToSendMessage() // 친구에게 메시지를 보내달라고 요청
// 출력 결과: "친구가 메시지를 보냅니다: 안녕!"
you.delegate = friend으로 너의 대리자를 friend로 설정했다. 이제 You 클래스는 친구에게 메시지를 보내달라고 부탁할 수 있고, 실제로 메시지를 보내는 건 친구가 처리한다.
▶ 왜 Delegate를 사용할까?
- 역할 분리: 각각의 객체가 자신이 잘하는 일만 하게 만들 수 있다. 예를 들어, 네가 모든 메시지를 직접 보내야 한다면 코드가 복잡해질 텐데, 대신 메시지 보내는 걸 친구에게 맡기면 더 깔끔해진다.
- 재사용성: Delegate 패턴을 사용하면 다른 객체도 동일한 일을 쉽게 맡길 수 있다. 친구뿐만 아니라, 다른 사람(다른 클래스)에게도 메시지를 보내달라고 할 수 있다.
- 유연성: Delegate 패턴을 사용하면 객체 간의 결합을 느슨하게 만들어서 필요에 따라 쉽게 다른 대리자를 지정할 수 있다.
▶ 요약하자면..
Delegate 패턴은 어떤 객체가 자신의 일부 역할을 다른 객체에게 위임하는 방식이다. 이를 통해 객체 간의 결합을 느슨하게 만들고, 코드를 더 모듈화하고 관리하기 쉽게 만들어준다. Delegate는 Swift와 iOS 개발에서 매우 자주 사용되는 패턴이니, 이해하면 많은 부분에서 쉽게 응용할 수 있을 것이다!
'프로그래밍 > iOS' 카테고리의 다른 글
IOS - 카카오맵 SDK V2 설치 (6) | 2024.10.03 |
---|---|
애플 개발자 문서 (1) | 2024.09.20 |
[iOS] Swift 공부 - 24 (1) | 2024.06.13 |
[iOS] Swift 공부 - 23 (0) | 2024.05.30 |
[iOS] Swift 공부 - 22 (0) | 2024.05.23 |