델리게이션(Delegation)은 위임이라는 뜻으로, 프로그래밍에서 특정 객체가 자신의 업무를 다른 객체에게 맡기는 것을 의미합니다. 이는 코드의 재사용성을 높이고, 객체 간의 결합도를 낮추어 유연하고 확장 가능한 프로그램을 만드는 데 중요한 역할을 합니다.
델리게이션의 기본 개념
델리게이션은 객체 지향 프로그래밍의 핵심 원칙 중 하나인 '컴포지션 오버 상속(Composition over Inheritance)'을 구현하는 데 자주 사용됩니다. 상속은 부모 클래스의 모든 것을 자식 클래스가 물려받는 방식이지만, 델리게이션은 필요한 기능만 선택적으로 위임받아 사용하는 방식입니다. 예를 들어, '자동차' 객체가 '엔진' 객체의 '시동 걸기' 기능을 사용하고 싶을 때, 자동차가 직접 엔진의 기능을 구현하는 대신 엔진 객체에게 '시동 걸어줘'라고 요청하는 것입니다. 이를 통해 자동차 클래스는 엔진의 복잡한 내부 구현을 알 필요 없이 단순히 엔진 객체에게 작업을 위임하면 됩니다.
델리게이션의 장점
- 코드 재사용성 증가: 특정 기능을 별도의 객체로 분리하여 여러 곳에서 재사용할 수 있습니다. 예를 들어, '로그 기록' 기능을 여러 클래스에서 사용해야 할 때, 별도의 로거(Logger) 객체를 만들어 각 클래스에서 해당 로거 객체에게 로그 기록을 위임하면 됩니다.
- 유연성 및 확장성: 상속과 달리, 런타임 시점에 어떤 객체에게 작업을 위임할지 동적으로 변경할 수 있습니다. 이는 프로그램의 유연성을 크게 향상시키며, 새로운 기능을 추가하거나 기존 기능을 수정할 때 다른 부분에 미치는 영향을 최소화합니다.
- 결합도 감소: 객체 간의 의존성을 낮춥니다. 델리게이션을 사용하면 객체는 위임받은 객체의 인터페이스만 알면 되므로, 내부 구현이 변경되어도 영향을 덜 받습니다. 이는 유지보수성을 높이는 데 기여합니다.
델리게이션의 활용 사례
델리게이션은 다양한 프로그래밍 언어와 프레임워크에서 광범위하게 활용됩니다.
- iOS 개발 (Swift/Objective-C): iOS 개발에서 델리게이션 패턴은 매우 중요합니다. 예를 들어,
UITableViewDataSource나UIViewController의 델리게이트는 테이블 뷰나 뷰 컨트롤러의 동작을 다른 객체(데이터 소스 또는 뷰 컨트롤러)에게 위임하여 구현합니다. 이를 통해 UI 컴포넌트는 UI 로직에만 집중하고, 데이터 관리나 사용자 인터랙션 처리는 다른 객체가 담당하게 됩니다. - Java Swing: GUI 개발 시, 이벤트 처리를 델리게이션 패턴으로 구현하는 경우가 많습니다. 버튼 클릭과 같은 이벤트가 발생했을 때, 해당 이벤트를 처리할 델리게이트 객체에게 작업을 위임합니다.
- 디자인 패턴: 옵저버 패턴, 전략 패턴 등 여러 디자인 패턴에서도 델리게이션의 원리가 적용됩니다. 예를 들어, 옵저버 패턴에서 주체(Subject) 객체는 상태 변화를 관찰자(Observer) 객체들에게 알리는 작업을 위임합니다.
델리게이션 구현 방법 (예시 - Swift)
Swift에서는 프로토콜을 사용하여 델리게이션을 구현하는 것이 일반적입니다.
// 1. 델리게이트 프로토콜 정의
protocol MyDelegate: AnyObject {
func didSomethingHappen(data: String)
}
// 2. 델리게이션을 위임할 객체 (Sender)
class Sender {
weak var delegate: MyDelegate? // 약한 참조를 사용하여 순환 참조 방지
func performAction() {
// 어떤 작업을 수행하고...
let result = "작업 완료!"
// 델리게이트에게 결과 알림
delegate?.didSomethingHappen(data: result)
}
}
// 3. 델리게이트 역할을 할 객체 (Receiver)
class Receiver: MyDelegate {
func didSomethingHappen(data: String) {
print("Sender로부터 메시지 받음: \(data)")
}
}
// 4. 사용 예시
let sender = Sender()
let receiver = Receiver()
sender.delegate = receiver // 델리게이트 설정
sender.performAction() // Sender가 작업을 수행하고 Receiver에게 알림
위 예시에서 Sender는 MyDelegate 프로토콜을 따르는 객체에게 didSomethingHappen 메소드 호출을 위임합니다. Receiver는 MyDelegate 프로토콜을 준수하여 실제 동작을 구현하고, Sender의 델리게이트로 자신을 설정합니다. Sender가 performAction을 호출하면, delegate?.didSomethingHappen(data: result) 라인을 통해 Receiver의 didSomethingHappen 메소드가 실행됩니다.
결론
델리게이션은 객체 간의 책임 분담을 통해 코드의 재사용성, 유연성, 확장성을 높이는 강력한 프로그래밍 기법입니다. 특히 iOS 개발 등 다양한 환경에서 핵심적인 디자인 패턴으로 활용되므로, 그 개념과 구현 방법을 잘 이해하고 있다면 더욱 효율적이고 유지보수하기 좋은 코드를 작성하는 데 큰 도움이 될 것입니다.