티스토리 뷰
도입
오늘 평소대로 코딩을 하던 도중 선배와 코드 리뷰를 하던 도중 델리게이트 패턴이라는 얘기가 나왔다. 선배가 델리게이트 패턴에 대해 대략적인 설명도 해주시고 델리게이트 패턴을 적용하면 코드 재사용성이 좋아지고 유지보수하기가 쉬워진다라고 말씀하셨지만 직접 정리해보는게 도움이 될거라고 생각하면 오랜만에 블로그 글을 작성하기로 하였다.
델리게이트 패턴이란?
Delegate는 위임하다라는 사전적인 의미를 가지고 있는데 이 뜻을 의식하면서 이해해보려고 하였다. 원래 본인이 해야할 작업을 다른 객체에게 자신의 일을 위임하는 패턴이 델리게이트 패턴인 것이다. 그럼 다음 예시를 알아보자!
그럼 어떻게 쓸 것인가?
실생활로 예시를 들어보자. 이제 직장도 구했고 방을 구해야 하는데 전세 대출도 알아봐야 하고 부동산 돌면서 방도 알아봐야 하고 계약서도 꼼꼼히 검토하면서 계약해야 하는 것이 너무 번거롭다. 그래서 나 대신에 방을 구해다 줄 사람, 즉 위임자(대리인)을 구하고자 한다.
우선 나라는 일개 노동자가 본업은 본업대로 하면서 방 계약까지 직접 해야하는 코드는 대략적으로 다음과 같을 것이다.
델리게이트 패턴을 사용하지 않을 때 코드
public class Worker {
private String name;
Person(String name) {
this.name = name;
}
void 본업() {
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
}
void 전세 대출() {
대출되는 은행 탐방~~
...
};
void 부동산 돌기() {
부동산 10곳 찾기
...
};
void 계약 하기() {
계약서 꼼꼼히 검토
...
};
}
위 예시는 정말 간략하게 나타냈지만 실제 코드 같은 경우에는 훠어어얼씬 더 길어질 것이다. 그리고 나 뿐만 아니라 나와 동일한 처지의 친구도 본업만 다를 뿐이지 방을 구하기 위해 필요한 행위는 같을 것이다. 그렇다면 방 계약만을 따로 도와줄 수 있는 위임자가 있다면 그 분에게 나와 친구의 방 계약을 맡긴다면 훨씬 효율적일 것이다.
델리게이트의 타입 선언(인터페이스)
그렇다면 RoomGetter라는 인터페이스를 만들어보는 것으로 시작해보자. 인터페이스에는 방을 구하는 사람이 해야하는 일을 선언할 것이다. 그리고 RoomGetter라는 인터페이스를 구현하는 FirstRoomGetter 클래스를 구현할 것이다.
public interface RoomGetter {
void 전세 대출();
void 부동산 돌기();
void 계약하기();
}
본래 코드에 델리게이트 변수 생성
델리게이트 패턴을 사용하기 위한 Worker 클래스의 코드는 다음과 같이 변경될 것이다. 이제 Worker는 방 계약과 관련된 코드를 직접 수행하지 않고 RoomGetter 타입을 가진 delegate 객체에게 시키면 된다.
public class Worker {
private String name;
private RoomGetter delegate;
Person(String name) {
this.name = name;
}
void 본업() {
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
수없이 많은일~~~~~
}
void 방 계약() {
delegate.전세 대출();
delegate.부동산 돌기();
delegate.계약하기();
}
}
델리게이트 타입을 구현하는 클래스
그럼 실제 RoomGeter를 구현하는 FirstRoomGetter라는 클래스를 구현해보자. 생성할 때 Worker를 인자로 받아 인자에 자기 자신을 등록해줘야 한다. 그리고 실제 방을 계약하기 위해 필요한 함수를 구현한다.
public class FirstRoomGetter implements RoomGetter {
FirstRoomGetter(Worker: worker) {
worker.delegate = this;
}
void 전세 대출() {
대출되는 은행 탐방~~
...
};
void 부동산 돌기() {
부동산 10곳 찾기
...
};
void 계약 하기() {
계약서 꼼꼼히 검토
...
};
}
델리게이트 사용 코드
그리고 다음과 같이 사용하면 되는 것이다.
Worker me = new Worker();
RoomGetter roomGetter = new FirstRoomGetter(me);
me.방 계약();
델리게이트 패턴 왜 사용할까?
지금은 적용해보기 전에 글을 통해 내용을 정리하는 단계라서 직접 델리게이트 패턴의 유용함을 체감한 것은 아니다. 하지만, 지금 당장 어렴풋이 느껴지는 장점을 요약하자면 다음과 같다.
- 코드의 분리를 통해서 다른 클래스에서도 사용이 가능해져 코드의 재사용성이 좋아진다.
- 하나의 파일에 과도하게 쓰여지던 코드를 분리하여 유지보수가 편해진다.
- 인터페이스를 통해 어떤 일을 해야하는지 정해놓았지만 세세한 구현이 조금씩 다르더라도 각 클래스에서 따로 구현을 하고 가져다 쓰는 것은 인터페이스에서 정의한 함수를 가져다 쓰기만 하면 된다.
- 작업을 전달해야 할 경우가 있을 때 처리해야 하는 부분만을 전달할 수 있다.
공부하면서 느낀 점
델리게이트 패턴을 찾아보았을 뿐인데 iOS와 관련된 내용이 저엉어어엉엉말 많았다. iOS에서는 흔히들 쓰는 패턴인가보다. 하지만 iOS의 Swift 같은 경우에는 델리게이트 패턴을 쉽게 구현할 수 있도록 언어적인 지원이 되는 것 같은데 Java에는 그런 역할을 하는 예약어가 없는 듯하다. 얼마 안 있다가 코틀린으로 안드로이드 앱을 작업해야 할 일이 생긴 것 같은데 코틀린의 by라는 예약어를 통해 델리게이트 패턴의 적용이 된다는 것 같다. 나중에 코틀린에서도 델리게이트 패턴을 적극 적용해봐야겠다.
'Programming > 기타' 카테고리의 다른 글
개발 공부 제대로 하는 법! (feat. 엘리 코딩) (1) | 2022.08.23 |
---|---|
클린 아키텍처 (0) | 2021.09.16 |
Reactive Programming이란? (0) | 2021.06.14 |
함수형 프로그래밍 간단 요약 (feat. 깡샘) (0) | 2021.04.25 |
MVC, MVP, MVVM 디자인 패턴 간단 정리 (0) | 2021.04.16 |