inblog logo
|
DailyCoding
    Spring Boot

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

    박은서's avatar
    박은서
    Feb 25, 2026
    13-8. 위임 패턴 (Delegation Pattern)
    Contents
    1. 위임 패턴 (Delegation Pattern)1️⃣ 위임 패턴이란?2️⃣ 비유로 이해하기3️⃣ 동작 흐름4️⃣ 코드 예시 (개념용)5️⃣ 상속 vs 위임6️⃣ 언제 쓰면 좋은가?7️⃣ 대표 활용 사례8️⃣ 위임 패턴의 장단점9️⃣ 그림으로 이해하기2. 실습 (ex08)1️⃣ 기본2️⃣ 상태 (for문 돌리려면 상태가 필요!)3️⃣ 인터페이스 (메서드 이름 실수하지 않도록!)4️⃣ 위임

    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
    Contents
    1. 위임 패턴 (Delegation Pattern)1️⃣ 위임 패턴이란?2️⃣ 비유로 이해하기3️⃣ 동작 흐름4️⃣ 코드 예시 (개념용)5️⃣ 상속 vs 위임6️⃣ 언제 쓰면 좋은가?7️⃣ 대표 활용 사례8️⃣ 위임 패턴의 장단점9️⃣ 그림으로 이해하기2. 실습 (ex08)1️⃣ 기본2️⃣ 상태 (for문 돌리려면 상태가 필요!)3️⃣ 인터페이스 (메서드 이름 실수하지 않도록!)4️⃣ 위임

    DailyCoding

    RSS·Powered by Inblog