앱 만들기/안드로이드

익명클래스 는 언제 사용되나요?

나도 처음이야 2022. 4. 23.

https://soo0100.tistory.com/1794

 

Java - 중첩 인터페이스가 필요한 이유

자바에서 중첩 인터페이스는 주로, 이벤트 구현 목적으로 사용된다. 중첩 인터페이스는 멤버 인스턴스와 정적 멤버 인스턴스로 나뉠 수 있는데 안드로이드 및 자바의 UI 이벤트 구현을 위해서는

soo0100.tistory.com

익명 클래스는 클래스 이름이 없는 클래스를 말합니다.

사용처는 주로 윈도우 나 안드로이드의 UI 이벤트 시스템을 구현 시 사용이 됩니다.

지난 시간에는 중첩클래스를 사용해서 클릭 이벤트를 구현해보았습니다.

동일한 구성이나, 컴포넌트에 대한 클래스를 별도로 생성해서 변수로 담고 있지 않다는 것이 다릅니다.

익명 클래스는 이름이 없기때문에 익명 클래스를 선언한 특정한 범위 내에서만 사용됩니다.

 

익명 클래스가 되기위해서는 하나의 조건이 있습니다.

상위 클래스를 상속 받거나, 인터페이스를 구현해야 합니다.

코드로 보겠습니다.

 

버튼 클래스는 클릭 이벤트 구현을 위해서 정적멤버 인터페이스를 선언한 상태입니다.

public class Button {
	
	//인터페이스 타입 필드
	OnClickListener listener;
	
	//중첩 인터페이스 
	static interface OnClickListener{
		void OnClick();
	}
	
	void touch() {
		listener.OnClick();		
	}
	
	void setOnClickListener(OnClickListener listener) {
		this.listener = listener;
	}

}

Main 함수에서는 버튼의 클릭 리스너에

UI컴포넌트들의 리스너를 매개변수 자동형변환으로 세팅하고 있습니다.

public class InnerInterfaceTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Button btn = new Button();
		
		btn.setOnClickListener(new CallListener());
		btn.touch();
		btn.setOnClickListener(new MessageListener());	
		btn.touch();			
	}
}

지난 시간에는 바로, CallListener 와 MessageListener 를 하기와 같이 선언한 상태였습니다.

해당 클래스는 인스턴스 변수 생성으로 어디선든 접근이 가능한 구조입니다.

public class CallListener implements Button.OnClickListener {

	@Override
	public void OnClick() {
		// TODO Auto-generated method stub
		System.out.println("Get a call");		
	}
	
}
public class MessageListener implements Button.OnClickListener {

	@Override
	public void OnClick() {
		// TODO Auto-generated method stub
		System.out.println("Get a message");
	}	
}

 

그런데, 해당 클래스의 쓰임이 btn.setOnClickListener() 에서만 사용된다면?

굳이 클래스를 별도로 선언하지 않아도 됩니다. 이럴때 바로 익명클래스가 활용이 됩니다.

구현 내용입니다.


public class InnerInterfaceTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Button btn = new Button();
		
		//btn.setOnClickListener(new CallListener());
		btn.setOnClickListener(new Button.OnClickListener() {
			
			@Override
			public void OnClick() {
				// TODO Auto-generated method stub
				System.out.println("Get a call");	
			}
		});
		
		btn.touch();
		//btn.setOnClickListener(new MessageListener());	
		btn.setOnClickListener(new Button.OnClickListener() {
			
			@Override
			public void OnClick() {
				// TODO Auto-generated method stub
				System.out.println("Get a Message");	
			}
		});
	
		btn.touch();		

	}
}

결과는 지난 시간과 동일합니다. ^^

Get a call
Get a message

 

앞서 우리는 익명클래스가 되기 위해서는 특정 클래스를 상속하거나 인터페이스를 구현해야 된다고 했습니다.

그런데 하기에는 extends 나 implements 라는 키워드가 보이지 않는데요?

btn.setOnClickListener(new Button.OnClickListener() {
			
			@Override
			public void OnClick() {
				// TODO Auto-generated method stub
				System.out.println("Get a Message");	
			}
		});

맞습니다. 

new Button.OnClickListener() {...}

위 표현은 인터페이스를 구현 해서 중괄호 {} 와 같이 자식클래스를 선언하라는 뜻입니다.

즉, 인터페이스를 구현한 익명클래스가 탄생한 것이죠.

 

UI 이벤트 구성에 필요한, 익명클래스의 사용법을 확인해보았습니다.

감사합니다. ^^

반응형

댓글