위임 숨기기
IT위키
더 많은 작업
위임 숨기기(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]
- 클라이언트가 호출하는 대리자의 메서드마다 서버에 같은 일을 하는 위임 메서드를 만든다
- 클라이언트가 서버의 위임 메서드를 부르게 고친다
- 더 이상 클라이언트가 대리자를 꺼낼 필요가 없으면 서버에서 대리자를 돌려주던 접근 메서드를 지운다[2]
- 메서드 이름 바꾸기(Rename Method) - 메서드가 하는 일을 잘 드러내도록 이름만 바꾼다. 의존 관계는 그대로다. getOwner() 를 getOwnerName() 으로 바꾼 것처럼 보여도, 반환형이 Person 에서 String 으로 바뀌고 Person 의 메서드를 대신 호출하게 되었다면 이름 바꾸기가 아니라 위임 숨기기다
- 다운캐스트 캡슐화(Encapsulate Downcast) - 호출하는 쪽에서 하던 형 변환을 메서드 안으로 옮겨 구체 타입을 돌려준다. 객체 사이의 위임과는 관계가 없다
- 메서드 이동(Move Method) - 메서드의 소속을 다른 클래스로 옮긴다. 위임 숨기기는 메서드를 옮기지 않고 서버에 위임 메서드를 더한다
- ↑ 1.0 1.1 Martin Fowler, 「Hide Delegate」, Catalog of Refactorings, https://refactoring.com/catalog/hideDelegate.html, 확인일: 2026-11-05.
- ↑ 2.0 2.1 2.2 2.3 2.4 「Hide Delegate」, Refactoring.Guru, https://refactoring.guru/hide-delegate, 확인일: 2026-11-05.