목차

iOS 델리게이트 패턴 vs Java IoC (의존성 주입)

객체 간의 결합도를 줄이고 유연성을 높이는 데 사용되는 디자인 원칙이지만, 구현 방식과 목적에 차이가 있다.

한 객체가 자신의 일부 작업을 다른 객체에게 위임하는 디자인 패턴. 주로 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()

객체가 자신의 의존성을 직접 생성하거나 관리하지 않고, 외부에서 주입받아 사용하는 디자인원칙. 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 이벤트 처리대규모 앱 의존성 관리
유연성대리자 교체 가능, 호출 시점은 델리게이터가 결정런타임에 의존성 교체 가능