profile image

L o a d i n g . . .

article thumbnail image
Published 2022. 7. 13. 20:41

익명객체(annonymous object)?

이름이 없는 객체.

어떤 클래스를 상속하거나 인터페이스를 구현해야만 한다

 

public class Person {
	void wake() {
		System.out.println("6시에 일어납니다");
	}
}
public class Anonymous {
	// 필드 초기값으로 대입, 필드값으로 익명 객체 대입
	Person field = new Person() {
		void work() {
			System.out.println("출근합니다");
		}
		void wake() {		
			System.out.println("5시에 일어납니다.");
			work();
		}
	}; // 익명 자식 객체 생성은 하나의 실행문이므로 끝에 세미콜론을 반드시 붙여야한다. 
	
	void method1() {
		//로컬 변수값으로 대입, 변수값으로 익명 객체 대입
		Person localVar = new Person() {
			void walk() {
				System.out.println("산책합니다");
			}
			
			void wake() {		
				System.out.println("7시에 일어납니다.");
				walk();
			}
		}; 
		// 로컬 변수 사용
		localVar.wake();
	}
	
	void method2(Person person) {
		person.wake();
	}
}

 

 

public class AnonymousEx {
	public static void main(String[] args) {
		Anonymous anonymous = new Anonymous();
		
		anonymous.field.wake();
		
		anonymous.method1();
		
		anonymous.method2(new Person() {
			void study() {
				System.out.println("공부합니다");
			}
			void wake() {		
				System.out.println("5시에 일어납니다.");
				study();
			}
		});
	}
}

field 는 필드 선언 시 초기값으로 익명 자식 객체를 생성해서 대입하였다.

두번째 method1()은 로컬변수에 자식 객체를 대입했고

 

마지막은 메소드의 매개 변수가 부모타입일 경우 메소드를 호출하는 코드에서 익명 자식 객체를 생성해서 매개값을 대입하였다.

 

 

 

 

 

 

 


 

인터페이스 타입으로 익명 구현 객체 생성

public interface RemoteControl {
	public void turnOn();
	public void turnOff();
}
public class AnonymousRC {
	RemoteControl field = new RemoteControl() {
		@Override
		public void turnOn() {
			System.out.println("TV를 켭니다");
		}
		
		@Override
		public void turnOff() {
			System.out.println("TV를 끕니다");
		}
	};
	
	void method1() {
		RemoteControl localVar = new RemoteControl() {
			
			@Override
			public void turnOn() {
				System.out.println("audio를 켭니다");
			}
			
			@Override
			public void turnOff() {
				System.out.println("audio를 끕니다");
			}
		};
		localVar.turnOn();
		localVar.turnOff();
	}
	
	void method2(RemoteControl rc) {
		rc.turnOn();
	}
}
public class AnonymousRCEx {
	public static void main(String[] args) {
		AnonymousRC anonymous = new AnonymousRC();

		anonymous.field.turnOn();
		
		anonymous.method1();
		
		anonymous.method2(new RemoteControl() {
			
			@Override
			public void turnOn() {
				System.out.println("스마트 티비를 켭니다");
			}
			
			@Override
			public void turnOff() {
				System.out.println("스마트 티비를 끕니다");
			}
		});
	}
}

 

 

 

 

 

 

 

 

 


윈도우 및 안드로이드 등의 UI  프로그램에서 버튼 클릭 이벤트 처리를 위해 익명 구현 객체 사용

public class Button {
	OnClickListener listener;
	
	void setOnClickListener(OnClickListener listener) {
		this.listener = listener;
	}
	
	void touch() {
		listener.onClick();
	}
	
	static interface OnClickListener{
		void onClick();
	}
}

중첩 인터페이스(OnClickListener)타입으로 필드(listener)를 선언 하고 세터 메소드로 외부에서 구현 객체를 받아 필드에 대입.

버튼 이벤트 발생 시(touch() 메소드가 실행되었을 때) 인터페이스를 통해 구현 객체의 메소드를 호출(listener.onClick())한다

 

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();
	}
}

첫번째 버튼1의 클릭 이벤트 처리는 필드로 선언한 익명 구현 객체가 담당

두번째 버튼2의 클릭 이벤트 처리는 setOnClickListener()를 호출할 때 매개값으로 준 익명 구현 객체가 담당

 

 

 

참고:

 

- 혼자 공부하는 자바(신용권), 한빛미디어

 

 

반응형

'개발 > JAVA' 카테고리의 다른 글

[Java] java.lang 패키지  (0) 2022.07.20
[Java] 예외처리  (0) 2022.07.18
[Java] 중첩클래스와 중첩 인터페이스  (0) 2022.07.13
[Java] 인터페이스(Interface)  (0) 2022.07.12
[Java] 추상(abstract) 클래스  (0) 2022.07.12
복사했습니다!