1. 위임 패턴 (Delegation Pattern)
1️⃣ 위임 패턴이란?
1) 개념
객체 A가 어떤 기능을 직접 수행하지 않고 객체 B에게 요청을 전달
➡️ "내가 하지 말고 너가 해줘"
어떤 객체가 자신의 작업 일부를 다른 객체에게 맡겨 처리하도록 하는 설계 방식
2) 핵심 목적
- 역할 분리 (Separation of Concerns)
- 유연성 증가 (Flexibility)
- 상속(Inheritance) 대체 / 보완
- 코드 재사용성 향상
3) 구조
- Client (사용자)
- Delegator (위임자)
- Delegate (수행자)
2️⃣ 비유로 이해하기
🍽 레스토랑 예시
- 손님 → 주문
- 웨이터 → 주문 접수 (Delegator)
- 주방 → 실제 요리 (Delegate)
웨이터는 요리 안 함 → 전달만 함
3️⃣ 동작 흐름
- Client → Delegator 호출
- Delegator → Delegate에게 작업 전달
- Delegate → 작업 수행
- 결과 반환
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️⃣ 그림으로 이해하기



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) 결과

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) 결과

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) 결과

Share article