iOS 델리게이트 패턴 vs Java IoC (의존성 주입)
목차
객체 간의 결합도를 줄이고 유연성을 높이는 데 사용되는 디자인 원칙이지만, 구현 방식과 목적에 차이가 있다.
델리게이트 패턴 (Swift)
한 객체가 자신의 일부 작업을 다른 객체에게 위임하는 디자인 패턴. 주로 1:1관계에서 사용되며, 위임받은 객체가 작업을 수행.
특징
- 1:1관계: 특정 작업을 하나의 대리자에게 위임.
- 명시적 호출: 작업이 발생하면 델리게이터가 대리자(델리게이트)의 메서드를 직접 호출
- 유연성: 대리자를 교체하거나 확장할 수 있으므로 코드 재사용성이 높음
- 구현 방식: 프로토콜을 정의하고, 대리자가 이를 구연하여 동작을 수행
protocol TaskDelegate {
func taskDidComplete(result: String)
}
class Worker {
var delegate: TaskDelegate?
func performTask() {
let result = "Task Completed"
delegate?.taskDidComplete(result: result)
}
}
class Manager: TaskDelegate {
func taskDidComplete(result: String) {
print("Manager received result: \(result)")
}
}
let worker = Worker()
let manager = Manager()
worker.delegate = manager
worker.performTask()IoC - 의존성 주입 (Java)
객체가 자신의 의존성을 직접 생성하거나 관리하지 않고, 외부에서 주입받아 사용하는 디자인원칙. DI(의존성 주입)을 통해 구현.
특징
- 제어권의 역전: 객체가 자신이 상용할 의존성을 직접 생성하지 않고, 외부컨테이너(ex: spring Ioc)가 의존성을 주입
- 유연성과 확장성: 의존성 주입을 통해 클래스 간 결합도을 낮추고, 런타임에 의존성을 쉽게 교체 가능
public interface TaskService {
void executeTask();
}
public class TaskServiceImpl implements TaskService {
@Override
public void executeTask() {
System.out.println("Executing Task");
}
}
public class Worker {
private TaskService taskService;
// Constructor Injection
public Worker(TaskService taskService) {
this.taskService = taskService;
}
public void performTask() {
taskService.executeTask();
}
}
// Main 실행
public class Main {
public static void main(String[] args) {
// IoC 컨테이너 역할 (수동으로 구현)
TaskService taskService = new TaskServiceImpl();
Worker worker = new Worker(taskService);
worker.performTask();
}
}비교
| 특징 | 델리게이트 패턴 | IoC (DI) |
|---|---|---|
| 관계 유형 | 1:1, 특정 작업 위임 | 다수 의존성을 외부 컨테이너가 관리 |
| 제어권 | 델리게이터가 명시적으로 호출 | 외부 컨테이너가 의존성 생성/관리 |
| 목적 | 특정 작업을 다른 객체에 위임 | 객체 간 결합도 낮추기 |
| 구현 | 프로토콜(Swift) / 인터페이스(Java) | DI Container (Spring 등) |
| 사용 사례 | UI 이벤트 처리 | 대규모 앱 의존성 관리 |
| 유연성 | 대리자 교체 가능, 호출 시점은 델리게이터가 결정 | 런타임에 의존성 교체 가능 |