13-8. 위임 패턴 (Delegation Pattern)

박은서's avatar
Feb 25, 2026
13-8. 위임 패턴 (Delegation Pattern)

1. 위임 패턴 (Delegation Pattern)

1️⃣ 위임 패턴이란?

1) 개념

객체 A가 어떤 기능을 직접 수행하지 않고 객체 B에게 요청을 전달
➡️ "내가 하지 말고 너가 해줘"
어떤 객체가 자신의 작업 일부를 다른 객체에게 맡겨 처리하도록 하는 설계 방식

2) 핵심 목적

  • 역할 분리 (Separation of Concerns)
  • 유연성 증가 (Flexibility)
  • 상속(Inheritance) 대체 / 보완
  • 코드 재사용성 향상

3) 구조

  • Client (사용자)
  • Delegator (위임자)
  • Delegate (수행자)

2️⃣ 비유로 이해하기

🍽 레스토랑 예시

  • 손님 → 주문
  • 웨이터 → 주문 접수 (Delegator)
  • 주방 → 실제 요리 (Delegate)
웨이터는 요리 안 함 → 전달만 함

3️⃣ 동작 흐름

  1. Client → Delegator 호출
  1. Delegator → Delegate에게 작업 전달
  1. Delegate → 작업 수행
  1. 결과 반환

4️⃣ 코드 예시 (개념용)

❌ 직접 처리 방식

class Printer { void print() { System.out.println("출력 수행"); } }

✅ 위임 방식

class Engine { void start() { System.out.println("엔진 시작"); } } class Car { private Engine engine = new Engine(); void start() { engine.start(); // 👉 위임 } }
  • Car는 엔진 기능을 직접 구현하지 않음
  • Engine에게 맡김

5️⃣ 상속 vs 위임

구분
상속
위임
관계
is-a
has-a
결합도
강함
느슨
유연성
낮음
높음
변경 영향
작음
➡️ 현대 설계에서 자주 등장하는 원칙
"상속보다 조합(위임)을 선호하라"
(Favor Composition Over Inheritance)

6️⃣ 언제 쓰면 좋은가?

  • 기능을 외부 객체로 분리하고 싶을 때
  • 클래스 변경 영향 최소화
  • 런타임에 동작 교체 필요
  • 다중 상속 문제 회피

7️⃣ 대표 활용 사례

  • 전략 패턴 (Strategy Pattern)
  • 프록시 패턴 (Proxy Pattern)
  • 어댑터 패턴 (Adapter Pattern)
  • 서비스 레이어 구조
  • UI 이벤트 처리
➡️ 사실상 대부분의 패턴에서 사용됨 😄

8️⃣ 위임 패턴의 장단점

1) 장점

  • 유연한 구조
  • 낮은 결합도
  • 재사용성 향상
  • 테스트 용이
  • 변경 대응 쉬움

2) 단점

  • 객체 수 증가
  • 구조가 복잡해 보일 수 있음
  • 과도한 위임 시 가독성 저하

9️⃣ 그림으로 이해하기

notion image
notion image
notion image

2. 실습 (ex08)

1️⃣ 기본

1) ScienceStudent.java

C:\workspace\java_lab\designapp\src\ex08\student\ScienceStudent.java
package ex08.student; // 책임 : 숙제를 하는 것 public class ScienceStudent { public void doHomework() { System.out.println("과학 숙제를 합니다."); } }

2) MathStudent.java

C:\workspace\java_lab\designapp\src\ex08\student\MathStudent.java
package ex08.student; // 책임 : 숙제를 하는 것 public class MathStudent { public void doHomework() { System.out.println("수학 숙제를 합니다."); } }

3) App.java

C:\workspace\java_lab\designapp\src\ex08\App.java
package ex08; import ex08.student.MathStudent; import ex08.student.ScienceStudent; /** * 델리게이트 * 개념 : 객체가 자신이 직접 작업을 수행하지 않고 다른 객체에게 위임 * 쉬운 설명 : 다른 사람에게 일을 맡김 * * 목표 * 작접을 직접 수행하지 않고, 그 작접을 위임한다 * * 작업 순서 * 1. 규칙을 정한다. -> 어떤 과목인지 어떤 결과를 줘야하는지 * 2. 학생을 고른다. -> 과학 학생, 수학 학생 등 * 3. 숙제를 시킨다. -> 숙제를 하라고 한다. * * 사용 이유 * 효율적 : 직접 하기보다는 잘하는 인원에게 맡기면 빠르고 정확하니깐. * 유연성 : 일이 생기면 바로 맡길 수 있고, 새로운 친구에 맞는 숙제를 맡길 수 있다. * * 기능을 확장하면서 위임할때!! */ public class App { public static void main(String[] args) { MathStudent s1 = new MathStudent(); MathStudent s2 = new MathStudent(); ScienceStudent s3 = new ScienceStudent(); String keyboard = "MATH"; s1.doHomework(); s2.doHomework(); } }

4) 결과

notion image

2️⃣ 상태 (for문 돌리려면 상태가 필요!)

1) MathStudent.java

package ex08.student; // 책임 : 숙제를 하는 것 public class MathStudent { private static final String name = "MATH"; public void doHomework() { System.out.println("수학 숙제를 합니다."); } public boolean isSameHomework(String keyboard) { return name.equals(keyboard.toUpperCase()); } }

2) ScienceStudent.java

package ex08.student; // 책임 : 숙제를 하는 것 public class ScienceStudent { private static final String name = "SCIENCE"; public void doHomework() { System.out.println("과학 숙제를 합니다."); } public boolean isSameHomework(String keyboard) { return name.equals(keyboard.toUpperCase()); } }

3️⃣ 인터페이스 (메서드 이름 실수하지 않도록!)

1) Student.java (인터페이스)

C:\workspace\java_lab\designapp\src\ex08\student\Student.java
package ex08.student; public interface Student { void doHomework(); boolean isSameHomework(String keyboard); }

2) HistoryStudent.java

C:\workspace\java_lab\designapp\src\ex08\student\HistoryStudent.java
package ex08.student; public class HistoryStudent implements Student{ private static final String name = "HISTORY"; @Override public void doHomework() { System.out.println("역사 숙제를 합니다."); } @Override public boolean isSameHomework(String keyboard) { return name.equals(keyboard.toUpperCase()); } }

3) MathStudent.java

package ex08.student; // 책임 : 숙제를 하는 것 public class MathStudent implements Student { private static final String name = "MATH"; public void doHomework() { System.out.println("수학 숙제를 합니다."); } public boolean isSameHomework(String keyboard) { return name.equals(keyboard.toUpperCase()); } }

4) ScienceStudent.java

package ex08.student; // 책임 : 숙제를 하는 것 public class ScienceStudent implements Student { private static final String name = "SCIENCE"; public void doHomework() { System.out.println("과학 숙제를 합니다."); } public boolean isSameHomework(String keyboard) { return name.equals(keyboard.toUpperCase()); } }

5) App.java

package ex08; import ex08.student.HistoryStudent; import ex08.student.MathStudent; import ex08.student.ScienceStudent; import ex08.student.Student; import java.util.ArrayList; import java.util.List; /** * 델리게이트 * 개념 : 객체가 자신이 직접 작업을 수행하지 않고 다른 객체에게 위임 * 쉬운 설명 : 다른 사람에게 일을 맡김 * * 목표 * 작접을 직접 수행하지 않고, 그 작접을 위임한다 * * 작업 순서 * 1. 규칙을 정한다. -> 어떤 과목인지 어떤 결과를 줘야하는지 * 2. 학생을 고른다. -> 과학 학생, 수학 학생 등 * 3. 숙제를 시킨다. -> 숙제를 하라고 한다. * * 사용 이유 * 효율적 : 직접 하기보다는 잘하는 인원에게 맡기면 빠르고 정확하니깐. * 유연성 : 일이 생기면 바로 맡길 수 있고, 새로운 친구에 맞는 숙제를 맡길 수 있다. * * 기능을 확장하면서 위임할때!! */ public class App { public static void main(String[] args) { // 학생 6명 MathStudent s1 = new MathStudent(); MathStudent s2 = new MathStudent(); ScienceStudent s3 = new ScienceStudent(); HistoryStudent s4 = new HistoryStudent(); HistoryStudent s5 = new HistoryStudent(); HistoryStudent s6 = new HistoryStudent(); // 반 학생들 컬렉션에 담기 List<Student> students = new ArrayList<>(); students.add(s1); students.add(s2); students.add(s3); students.add(s4); students.add(s5); students.add(s6); // 선생님 "수학 수업 듣는 학생들 숙제 하세요!" String keyboard = "HISTORY"; students.stream() .filter(student -> student.isSameHomework(keyboard)) .forEach(student -> student.doHomework()); } }

6) 결과

notion image

4️⃣ 위임

1) HomeworkDelegator.java

C:\workspace\java_lab\designapp\src\ex08\HomeworkDelegator.java
package ex08; import ex08.student.HistoryStudent; import ex08.student.MathStudent; import ex08.student.ScienceStudent; import ex08.student.Student; import java.util.ArrayList; import java.util.List; // 어떤 숙제를 해야할지 정하는 것을 위임 받음! public class HomeworkDelegator { private List<Student> students = new ArrayList<>(); public HomeworkDelegator() { students.add(new MathStudent()); students.add(new MathStudent()); students.add(new ScienceStudent()); students.add(new HistoryStudent()); students.add(new HistoryStudent()); students.add(new HistoryStudent()); } public void delegateHomework(String keyboard) { students.stream() .filter(student -> student.isSameHomework(keyboard)) .forEach(student -> student.doHomework()); } }

2) App.java

package ex08; import ex08.student.HistoryStudent; import ex08.student.MathStudent; import ex08.student.ScienceStudent; import ex08.student.Student; import java.util.ArrayList; import java.util.List; /** * 델리게이트 * 개념 : 객체가 자신이 직접 작업을 수행하지 않고 다른 객체에게 위임 * 쉬운 설명 : 다른 사람에게 일을 맡김 * * 목표 * 작접을 직접 수행하지 않고, 그 작접을 위임한다 * * 작업 순서 * 1. 규칙을 정한다. -> 어떤 과목인지 어떤 결과를 줘야하는지 * 2. 학생을 고른다. -> 과학 학생, 수학 학생 등 * 3. 숙제를 시킨다. -> 숙제를 하라고 한다. * * 사용 이유 * 효율적 : 직접 하기보다는 잘하는 인원에게 맡기면 빠르고 정확하니깐. * 유연성 : 일이 생기면 바로 맡길 수 있고, 새로운 친구에 맞는 숙제를 맡길 수 있다. * * 기능을 확장하면서 위임할때!! */ public class App { public static void main(String[] args) { // 선생님 "수학 수업 듣는 학생들 숙제 하세요!" String keyboard = "MATH"; new HomeworkDelegator().delegateHomework(keyboard); } }

3) 결과

notion image
Share article