본문 바로가기
Work & Study/JAVA (& 혼공자Java)

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

by a.k.a DUKI 2020. 11. 24.
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
반응형