Work & Study/JAVA (& 혼공자Java)

자바(Java) - 익명 객체2 (익명 구현 객체 생성)

a.k.a DUKI 2020. 11. 24. 21:08
728x90
반응형

익명 구현 객체 생성

구현 클래스를 명시적으로 선언하는 이유는 어디서건 이미 선언된 구현 클래스로 간단히 객체를 생성해서 사용할 수 있기 때문이다. --> 재사용성이 높다.

 

그러나, 구현 클래스가 재사용 되지 않고 특정 위치에서만 사용된다면, 익명 구현 객체를 생성해서 사용하는 것이 좋다.

 

- 필드 선언 시 초기값으로 익명 구현 객체 생성하여 대입하는 경우

혼공자 유툽 참고

- 메소드 내에서 로컬 변수 선언 시 초기값으로 익명 구현 객체를 생성해서 대입

혼공자 유툽 참고

- 매개 변수의 매개값으로 익명 구현객체를 생성하여 대입

혼공자 유툽 참고

 

예시1) 익명 구현 객체 생성

인터페이스

public interface RemoteCtrl {
	public void turnOn();
	public void turnOff();
}

익명 구현 객체 생성

public class Anonymous {
	// 필드 초기값으로 대입
	RemoteCtrl field = new RemoteCtrl() { // 필드 선언과 초기값 대입

		@Override
		public void turnOn() {
			System.out.println("TV를 킨다.");
		}

		@Override
		public void turnOff() {
			System.out.println("TV를 끈다.");
		}
	};

	void method1() {
		// 로컬 변수값으로 대입
		RemoteCtrl localVar = new RemoteCtrl() { // 로컬 변수 선언과 초기값 대입

			@Override
			public void turnOn() {
				System.out.println("Audio를 킨다.");
			}

			@Override
			public void turnOff() {
				System.out.println("Audio를 끈다.");
			}
		};

		// 로컬 변수 사용
		localVar.turnOn();
		localVar.turnOff();
	}

	void method2(RemoteCtrl rc) {
		rc.turnOn();
		rc.turnOff();
	}
}

익명 구현 객체 생성

public class AnonymousEx {

	public static void main(String[] args) {
		Anonymous anony = new Anonymous();

		// 익명 객체 필드 사용
		anony.field.turnOn();
		anony.field.turnOff();

		// 익명 객체 로컬 변수 사용
		anony.method1();

		// 익명 객체 매개값 사용
		anony.method2(new RemoteCtrl() {// 매개값

			@Override
			public void turnOn() {
				System.out.println("SmartTV를 킨다.");
			}

			@Override
			public void turnOff() {
				System.out.println("SmartTV를 끈다.");
			}
		});
	}

}

 

 

 

예시2) 윈도우 및 안드로이드 등의 UI플로그램에서 버튼의 클릭 이벤트를 처리하기 위해 익명 구현 객체를 이용하는 방법이다.

UI 클래스

public class Button {
	static interface OnClickListener {// 중첩 인터페이스
		void onClick(); // 버튼이 클릭될 때 실행되는 메소드
	}

	// 인터페이스 타입 필드
	OnClickListener listener;

	void setOnClickListener(OnClickListener listener) {
		this.listener = listener;
	}
	
	void touch() {
		listener.onClick(); //구현 객체의 onClick() 메소드 호출
	}
}

UI 클래스

public class Window {
	Button button1 = new Button();
	Button button2 = new Button();

	// 필드 초기값으로 대입
	Button.OnClickListener listener = new Button.OnClickListener() { // 필드값으로 익명 객체 대입
		@Override
		public void onClick() {
			System.out.println("전화를 건다.");
		}
	};

	Window() {
		button1.setOnClickListener(listener); // 매개값으로 필드 대입
		button2.setOnClickListener(new Button.OnClickListener() { // 매개값으로 익명 객체 대입
			@Override
			public void onClick() {
				System.out.println("메세지를 보낸다.");
			}
		});
	}

}

실행 클래스

public class Main {

	public static void main(String[] args) {
		Window w = new Window();
		w.button1.touch(); //버튼 클릭
		w.button2.touch(); //버튼 클릭
	}

}

 

 

익명 객체의 로컬 변수 사용

메소드의 매개 변수나 로컬 변수를 익명 객체 내부에서 사용할 때의 제한

  • 메소드가 종료되어도 익명 객체가 계속 실행 상태로 존재할 수 있다. (heap 영역에 남아있을 수 있다.)
  • 컴파일 시 익명 객체에서 사용하는 매개 변수나 로컬 변수는 final특성을 가진다.

혼공자 유툽 참고

 

예시3) 익명 객체의 로컬 변수 사용

인터페이스

public interface Calculatable {
	public int sum();
}

익명 객체의 로컬 변수 사용

 

public class Anonymous {
	private int field;

	public void method(final int arg1, int arg2) {
		final int var1 = 0;
		int var2 = 0;

		// 내부 클래스에서 변경 가능한 접근제한자로 가능
		field = 10;

		// final특성을 갖고있어 값을 변경할 수 없다.
//		arg1 = 20;
//		arg2 = 20;

//		var1 = 30;
//		var2 = 30;

		Calculatable calc = new Calculatable() {

			@Override
			public int sum() {
				int result = field + arg1 + arg2 + var1 + var2;
				return result;
			}
		};
		System.out.println(calc.sum());
	}
}

익명 객체의 로컬 변수 사용

 

public class AnonymousEx {

	public static void main(String[] args) {
		Anonymous annoy = new Anonymous();
		annoy.method(0, 0);
	}

}

 

 

 

※용어 정리

  • 익명 자식 객체: 자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우라면 자식 클래스를 명시적으로 선언하지 않고 익명 자식 객체를 생성해서 사용한다.

부모클래스 [필드|변수] = new 부모클래스(매개값, ...){
	//필드
    //메소드
};
  • 익명 구현 객체: 구현 클래스가 재사용 되지 않고 오로지 특정 위치에서 사용할 경우라면 익명 구현 객체를 생성해서 사용 한다.

인터페이스 [필드|변수] = new 인터페이스(){
	//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
    //필드
    //메소드
};

 

 

본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.

 

728x90
반응형