DELEGATE

Yoon·2022년 7월 20일

Delegate 란?

Delegate는 사전적 의미로 "위임"의 뜻을 가지고 있다.
대리인은 우리와 다른 사람임에도 결정 권한이라는 행동에 대해 우리와 똑같이 행동할 수 있게 되는 것이다.

즉, 원래 본인이 해야할 작업을 다른 객체에게 자신의 일을 위임하는 패턴이 델리게이트 패턴인 것이다.


Delegate 사용전 (부동산 계약 관련)

Worker.java

public class Worker{
	private String name;
    Person(String name) {
    	this.name = name;
	}
    void 본업() {
    	일에관한 코드
        일에관한 코드
        일에관한 코드
        일에관한 코드
        일에관한 코드
	}
    void 전세 대출() {
    	대출되는 은행 탐방 -
        ...
	}
    void 부동산 돌기() {
    	부동산 10곳 찾기
        ...
	}
    void 계약 하기() {
    	계약서 꼼꼼히 검토
        ...
	}
}

나 뿐만 아니라 나와 동일한 처지의 친구도 본업만 다를 뿐이지 방을 구하기 위해 필요한 행위는 같은 것이다.
그렇다면 방 계약만을 따로 도와줄 수 있는 위임자가 있다면 그 분에게 나와 친구의 방 계약을 맡긴다면 효율적 일것이다.


Delegate 사용

RommGetter라는 인터페이스를 만들어보는 것으로 시작.
인터페이스에는 방을 구하는 사람이 해야하는 일을 선언.
그리고 RommGetter라는 인터페이스를 구현하는 FirstRoomGetter 클래스를 구현

RoomGetter

poublic interface RommGetter {
	void 전세 대출();
    void 부동산 돌기();
    void 계약하기();
}

본래 코드에 Delegate 변수 생성

Worker는 방계약과 관련된 코드를 직접 수행하지 않고 RoomGetter 타입을 가진 Delegate 객체에게 시키면 된다.

Worker.java

public class Worker {
	private String name;
    private RoomGetter delegate;
    Person(String name) {
    	this.name = name;
	}
    void 본업() {
    	일에관한 코드
        일에관한 코드
        일에관한 코드
        일에관한 코드
        일에관한 코드
	}
    void 방 계약() {
    	delegate.전세 대출();
        delegate.부동산 돌기();
        delegate.계약하기();
	}
}

Delegate 타입을 구현하는 클래스

RoomGetter를 구현하는 FirstRoomGetter라는 클래스를 구현.
생성할 때 Worker를 인자로 받아 인자에 자기 자신을 등록.
그리고 실제 방을 계약하기 위해 필요한 함수를 구현.

FirstRoomGetter.java

public class FirstRoomGetter implements RoomGetter {
	FirstRoomGetter(Worker: worker){
    	worker.delegate = this;
	}
    void 전세 대출() {
    	대출되는 은행 탐밤 - 
        ...
	}
    void 부동산 돌기() {
    	부동산 10곳 찾기
        ...
	}
    void 계약 하기() {
    	계약서 꼼꼼히 검토
        ...
	}
}

Delegate 사용할 때

사용시

Worker me = new Worker();
RoomGetter roomGetter = new FirstRoomGetter(me);
me.방 계약();

더더더 간단한 예시..

Main class가 실행되면 Print 객체의 print() 메서드가 실행되지만 실제 구현으로 보면 Print 객체가 하는 것이 아니라 Print 객체의 print()메서드가 RealPrinter의 print() 메서드를 호출하여 일을 위임하고 있다.

RealPrinter.java ---> delegate

class RealPrinter {
	void print() {
    	System.out.print("Something");
    }
}

Printer.java ---> delegator

class Printer {
	RealPrinter p = new RealPrinter(); // delegate(위임자) 생성
    void print() {
    	p.print(); // delegation
    }
}

Main.java

public class Main {
	public static void main(String[] args) {
    	Printer printer = new Printer();
        printer.print();
    }
}

더 간단한 예시

interface I {
	void f();
    void g();
}

class A implements I {
	public void f() { System.out.println("A: doing f()"); }
    public void g() { System.out.println("A: doing g()"); }
}

class B implements I {
	public void f() { System.out.println("B: doing f()"); }
    public void g() { System.out.println("B: doing g()"); }
}

class C implements I {
	// delefation
    I i = new A();
    
    public void f() { i.f(); }
    public void g() { i.g(); }
    
    // normal attribute
    public void toA() { i = new A(); }
    public void toB() { i = new B(); }
}

public class Main {
	public static void main(String[] args) {
    	C c = new C();
        c.f();	//o output: A: doing f()
        c.g();	//o output: A: doing g()
        c.toB();
        c.f();	//o output: B: doing f()
        c.g();	//o output: B: doing g()
        

Delegate 패턴 사용 이유

  1. 코드의 분리를 통해서 다른 클래스에서도 사용이 가능해져 코드의 재사용성이 좋아진다.
  2. 하나의 파일에 과도하게 쓰여지던 코드를 분리하여 유지보수가 편해진다.
  3. 인터페이스를 통해 어떤 일을 해야하는지 정해놓았지만 세세한 구현이 조금씩 다르더라도 각 클래스에서 따로 구현을 하고 가져다 쓰는 것은 인터페이스에서 정의한 함수를 가져다 쓰기만 하면 된다.
  4. 작업을 전달해야 할 경우가 있을 때 처리해야 하는 부분만을 전달할 수 있다.
  5. ★ 여러 클래스에서 겹치는 메소드를 줄이기 위해 사용.
profile
나의 공부 일기

0개의 댓글