본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

위임 숨기기(Hide Delegate)는 클라이언트가 어떤 객체(서버)에서 다른 객체(대리자)를 꺼내 그 메서드를 호출하던 것을, 서버에 대리자에게 일을 넘기는 위임 메서드를 만들어 클라이언트가 서버만 부르게 바꾸는 리팩토링 기법이다.

클라이언트가 person.getDepartment().getManager() 처럼 한 객체에서 다른 객체를 얻어 다시 호출하면, 클라이언트는 Person 뿐 아니라 Department 의 존재와 메서드까지 알아야 한다. Person 과 Department 의 관계가 바뀌면 클라이언트도 고쳐야 한다. 위임 숨기기는 서버(Person)에 getManager() 같은 메서드를 만들어 그 안에서 대리자(Department)를 부르게 하고, 클라이언트는 person.getManager() 만 호출하게 한다. 그러면 클라이언트는 대리자 클래스를 몰라도 되고, 객체 사이의 관계가 바뀌어도 서버만 고치면 된다.[1][2]

이 기법은 객체가 자기와 직접 관련된 객체에만 메시지를 보내라는 디미터 법칙을 지키게 하고, 호출이 객체 사슬을 따라 이어지는 메시지 체인(Message Chains) 냄새를 없애는 대표 수단이다.

  • 서버(server) - 클라이언트가 직접 접근하는 객체
  • 대리자(delegate) - 클라이언트에게 필요한 기능을 실제로 가진 객체
  • 호출 사슬(call chain) - 클라이언트가 한 객체에서 다른 객체를 얻고, 그 객체에서 또 다른 객체를 얻으며 클래스 구조를 따라 탐색하는 것. 구조가 바뀌면 클라이언트도 바뀌어야 한다[2]

클래스 다이어그램으로 보면 다음과 같이 바뀐다.

  • 바꾸기 전: UI → Car(getOwner(): Person), Car → Person(getName()). UI 는 car.getOwner().getName() 을 부르므로 Car 뿐 아니라 Person 에도 의존한다(UI 에서 Person 으로 점선 의존 화살표)
  • 바꾼 뒤: Car 에 getOwnerName(): String 을 만들고 그 안에서 owner.getName() 을 부른다. UI 는 car.getOwnerName() 만 부르고, UI 에서 Person 으로 가는 의존이 사라진다
// 바꾸기 전
String name = car.getOwner().getName();

// 바꾼 뒤
class Car {
    private Person owner;
    String getOwnerName() { return owner.getName(); }
}
String name = car.getOwnerName();

클라이언트가 대리자를 꺼낼 필요가 없어지면 서버의 접근자(getOwner())를 지울 수도 있다.[2]

  1. 클라이언트가 호출하는 대리자의 메서드마다 서버에 같은 일을 하는 위임 메서드를 만든다
  2. 클라이언트가 서버의 위임 메서드를 부르게 고친다
  3. 더 이상 클라이언트가 대리자를 꺼낼 필요가 없으면 서버에서 대리자를 돌려주던 접근 메서드를 지운다[2]

중간자 제거와의 관계

편집 원본 편집

위임 숨기기와 중간자 제거(Remove Middle Man)는 서로 반대 방향의 기법이다.[1]

기법 바꾸는 방향 알맞은 상황
위임 숨기기 서버에 위임 메서드를 만들어 대리자를 감춘다 클라이언트가 객체 사슬을 따라 호출해 여러 클래스에 의존할 때
중간자 제거 위임 메서드를 지우고 클라이언트가 대리자를 직접 부르게 한다 위임 메서드가 너무 많아 서버가 일 없이 전달만 하는 중개자(Middle Man)가 되었을 때

위임 메서드를 지나치게 많이 만들면 서버가 쓸데없는 중개자가 되므로, 둘 사이의 균형은 상황에 따라 다시 맞춘다.[2]

다른 기법과 구별하기

편집 원본 편집
  • 메서드 이름 바꾸기(Rename Method) - 메서드가 하는 일을 잘 드러내도록 이름만 바꾼다. 의존 관계는 그대로다. getOwner() 를 getOwnerName() 으로 바꾼 것처럼 보여도, 반환형이 Person 에서 String 으로 바뀌고 Person 의 메서드를 대신 호출하게 되었다면 이름 바꾸기가 아니라 위임 숨기기다
  • 다운캐스트 캡슐화(Encapsulate Downcast) - 호출하는 쪽에서 하던 형 변환을 메서드 안으로 옮겨 구체 타입을 돌려준다. 객체 사이의 위임과는 관계가 없다
  • 메서드 이동(Move Method) - 메서드의 소속을 다른 클래스로 옮긴다. 위임 숨기기는 메서드를 옮기지 않고 서버에 위임 메서드를 더한다
  1. ↑ 1.0 1.1 Martin Fowler, 「Hide Delegate」, Catalog of Refactorings, https://refactoring.com/catalog/hideDelegate.html, 확인일: 2026-11-05.
  2. ↑ 2.0 2.1 2.2 2.3 2.4 「Hide Delegate」, Refactoring.Guru, https://refactoring.guru/hide-delegate, 확인일: 2026-11-05.