Java Category/Java

[JAVA] 중첩 인터페이스 (nested interface)

ReBugs 2023. 7. 18.

이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다. 


중첩 인터페이스

중첩 인터페이스는 클래스의 멤버로 선언된 인터페이스를 뜻한다.

인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계이기 때문이다.

즉, 인터페이스 외부의 클래스가 존재하지 않는다면 해당 인터페이스는 쓸모가 없기 때문이다.

중첩 인터페이스는 아래와 같이 선언된다.

class A{
    [public | private] | [static] interface B{
        //상수 필드
        //추상 메소드
        //디폴트 메소드
        //정적 메소드
    }
}
  • 외부의 접근을 막지 않으려면 public
  • A 클래스 내부에서만 사용하려면 private
  • 접근 제한자를 붙이지 않으면 같은 패키지 안에서만 접근 가능
  • A 객체 없이 B 인터페이스를 사용하려면 static

 

중첩 인터페이스는 안드로이드와 같은 UI 프로그램에서 이벤트를 처리할 목적으로 많이 사용된다.

예를 들어 버튼을 클릭했을 때 이벤트를 처리할 중첩 인터페이스에 어떤 구현 객체가 들어가느냐에 따라 다른 결과를 낼 수 있다.

public class Button {
	//정적 멤버 인터페이스
	public static interface ClickListener {
		//추상 메소드
		void onClick();
	}

	//필드
	private ClickListener clickListener;

	//메소드
	public void setClickListener(ClickListener clickListener) { //setter
		this.clickListener = clickListener;
	}

	public void click() {
		this.clickListener.onClick();
	}
}
  • 인터페이스 타입 필드에 접근하려면 setter를 통해 접근해야함(필드가 private으로 접근 제한이 되어있으므로)
  • setter에는 인터페이스 타입 객체가 들어올 수 있고, setter를 통해 필드에 대입되는 객체가 달라질 수 있음.
  • click() 메소드를 호출하면 setter를 통해 대입된 객체의 onClick() 메소드가 호출된다.
  • 인터페이스에 여러개의 구현 객체가 대입됨으로써 다양한 버튼 클릭 이벤트를 구현할 수 있다.(다형성)

 

public class ButtonExample {
	public static void main(String[] args) {
		//Ok 버튼 객체 생성
		Button btnOk = new Button();
		//Ok 버튼 클릭 이벤트를 처리할 ClickListener 구현 클래스(로컬 클래스)
		class OkListener implements Button.ClickListener {
			@Override
			public void onClick() {
				System.out.println("Ok 버튼을 클릭했습니다.");
			}
		}
		//Ok 버튼 객체에 ClickListener 구현 객체 주입
		btnOk.setClickListener(new OkListener());
		//Ok 버튼 클릭하기
		btnOk.click();
		//-----------------------------------------------------------------------------
		//Cancel 버튼 객체 생성
		Button btnCancel = new Button();
		//Cancel 버튼 클릭 이벤트를 처리할 ClickListener 구현 클래스(로컬 클래스)
		class CancelListener implements Button.ClickListener {
			@Override
			public void onClick() {
				System.out.println("Cancel 버튼을 클릭했습니다.");
			}
		}
		//Cancel 버튼 객체에 ClickListener 구현 객체 주입
		btnCancel.setClickListener(new CancelListener());
		//Cancel 버튼 클릭하기
		btnCancel.click();
	}
}
/*
Ok 버튼을 클릭했습니다.
Cancel 버튼을 클릭했습니다.
*/
  • 위의 코드에는 OkListener(OK 버튼)과 CancelListener(Cancel 버튼) 구현 클래스가 정의되어 있다.
  • Button 클래스 내부의 setter에 해당 구현 객체를 전달한다.
  • setter는 필드를 매개변수로 받은 객체로 대입한다.
  • click() 메소드를 호출하면 어떤 구현 객체가 대입되었느냐에 따라서 출력되는 내용이 달라진다.
구현 객체는 보통 익명 객체로 설정한다.

 


 

중첩 인터페이스에 익명 객체 대입

2023.01.13 - [프로그래밍 언어/JAVA] - [JAVA] 익명 객체(Anonymous Object)

 

[JAVA] 익명 객체(Anonymous Object)

본 게시글은 혼자 공부하는 자바 (저자 : 신용권)의 책과 유튜브 영상을 참고하였고, 개인적으로 정리하는 글임을 알립니다. 익명 객체 클래스를 선언할 때 일반적으로 클래스 이름과 동일한 소

rebugs.tistory.com

위에서 살펴봤던 예제는 구현 클래스를 정의하고, setter에 해당 객체를 대입하는 방법이었다.

그 방법보다 setter에 익명 구현 객체를 넘기는 방법이 많이 사용된다.

Button.java

public class Button {	
	//정적 멤버 인터페이스
	public static interface ClickListener {
		//추상 메소드
		void onClick();
	}
	
	//필드
	private ClickListener clickListener;
		
	//메소드
	public void setClickListener(ClickListener clickListener) {
		this.clickListener = clickListener;
	}
	
	public void click() {
		this.clickListener.onClick();
	}
}

 

Main.java

public class Main {
	public static void main(String[] args) {
		//Ok 버튼 객체 생성
		Button btnOk = new Button();

		//Ok 버튼 객체에 ClickListener 구현 객체 주입
		btnOk.setClickListener(new Button.ClickListener() {
			@Override
			public void onClick() {
				System.out.println("Ok 버튼을 클릭했습니다.");
			}
		});

		//Ok 버튼 클릭하기
		btnOk.click();

		//----------------------------------------------------------------------------

		//Cancel 버튼 객체 생성
		Button btnCancel = new Button();

		//Cancel 버튼 객체에 ClickListener 구현 객체 주입
		btnCancel.setClickListener(new Button.ClickListener() {
			@Override
			public void onClick() {
				System.out.println("Cancel 버튼을 클릭했습니다.");
			}
		});

		//Cancel 버튼 클릭하기
		btnCancel.click();
	}
}

댓글