본문 바로가기

Programming/JAVA

중첩 클래스&인터페이스(5) - 익명 객체 6

java logo image

 

 

 

다음 예제를 통해서는 UI 프로그래밍에서 흔히 사용하는 방식을 알아보겠습니다. 여기서도 역시 익명 객체를 활용하는 형태로 구현을 진행하게 됩니다. 예제에서는 버튼의 클릭 이벤트를 Setter를 통해 설정하고, 실행하는 과정을 다루어 보겠습니다. 

 

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

 

Button 클래스입니다. 기본적으로 OnClickListener라는 중첩 인터페이스가 선언되어 있고, 메서드 onClick()이 선언되어 있습니다. 

 

버튼 클래스 내부에는 OnClickListener 타입의 listener 변수가 있습니다. 구현 클래스를 인스턴스를 의미하겠죠? 여기 구현 클래스 인스턴스에 어떤 종류의 구현 클래스를 넣을지를 결정하는 setOnClickListener 메서드도 선언되어 있습니다. 이 메서드의 파라미터는 당연히 OnClickListener 타입의 인스턴스가 되겠죠. 정확히는 이 타입으로 변환되는 구현 클래스의 인스턴스가 해당됩니다. 

 

setOnClickListener를 통해서 구현 클래스의 인스턴스가 정의되면, touch()를 통해서 해당 구현 클래스에서 재정의된 onClick() 메서드를 실행하게 됩니다. 

 

 

다음으로 Window 클래스입니다. 해당 윈도우에서 버튼 두 개를 배치하여 각각의 클릭 동작을 정의하는 상태라고 가정하겠습니다. 

 

우선 Button 클래스의 인스턴스 두 개를 생성하고, 각각 다른 방식으로 setOnClickListener를 정의해 보겠습니다. 기본적으로 Window 클래스의 생성자에서 각 버튼의 인스턴스에 인터페이스 구현 클래스를 적용하는 것을 전제하겠습니다. 

 

public class Window {
	Button btn1 = new Button();
	Button btn2 = new Button();
	
	Button.OnClickListener listener = new Button.OnClickListener() {
		
		@Override
		public void onClick() {
			// TODO Auto-generated method stub
			System.out.println("스토어 앱 실행");
		}
	};
	
	Window() {
		btn1.setOnClickListener(listener);
		btn2.setOnClickListener(new Button.OnClickListener() {
			
			@Override
			public void onClick() {
				// TODO Auto-generated method stub
				System.out.println("크롬 실행");
			}
		});
	}
}

 

위에서 해당 '윈도우' 클래스에 버튼 두 개를 선언해 정의했다고 보면 되겠네요. 일단 btn1과 btn2 인스턴스를 생성했습니다. 그리고 필드에 스토어 앱을 시행하는 구현 클래스를 선언해 두었습니다. 

 

생성자에서 각각의 버튼 인스턴스에 인터페이스 OnClickListener에 대한 구현 클래스 인스턴스를 적용합니다. btn1에서는 미리 필드에 선언해 둔 구현 클래스 인스턴스를 파라미터에 전달했습니다. btn2에서는 익명 인스턴스 형식으로 적용했습니다. 

 

 

이제 실행 클래스를 정의하겠습니다. 윈도우 클래스의 인스턴스를 생성하고, 해당 인스턴스에 필드로 선언된 버튼 클래스를 각각 지정해 touch()를 실행합니다. 

 

public class ExampleMain {	
	public static void main(String[] args) {
		Window window = new Window();
		
		window.btn1.touch();
		window.btn2.touch();
	}
}

/* 출력
스토어 앱 실행
크롬 실행
*/