이너 인터페이스 (inner interface)
- 인터페이스를 클래스 내부에 정의하는 것은 해당 클래스에 의존적인 기능을 수행할 때
- 사용자 인터페이스(user interface)의 이벤트 처리에 가장 많이 사용
ex)
버튼 클릭을 감지하는 인터페이스는 버튼 클래스 내부에 위치
1. 이너 인터페이스의 정의와 특징
- 정적 이너 인터페이스만 존재할 수 있음
- 이너 인터페이스 앞에 static 제어자를 생략하면 컴파일러가 자동으로 추가
class A {
//...
static interface B{
void bcd();
}
}
- 컴파일시 '아우터 클래스명$이너 인터페이스명.class' 형태로 .class 파일이 생성
- 자체적으로 객체 생성 불가
- 해당 인터페이스를 상속한 자식 클래스를 생성한 후 생성자를 이용해 객체를 생성하거나
익명 이너 클래스를 활용해 객체 생성
- 인터페이스가 클래스 내부에 존재하므로 객체의 타입을 '아우터 클래스명. 이너 인터페이스명'과 같이 사용
방법 1. 인터페이스 구현 클래스 생성 및 객체 생성
class C implements A.B [
public void bcd() {}
}
C c = new C();
c.bcd();
방법 2. 익명 이너 클래스 사용
A.B a = new A.B() {
public void bcd() {}
};
a.bcd();
2. 이벤트 처리 기능 작성하기
- Buttun클래스
- 기본적인 사용자 인터페이스 클래스는 API로 제공
- API가 제공하는 버튼의 일반적인 구조
class Button {
OnClickListener ocl;
void setOnClickListener(OnClickListener ocl) {
this.ocl = ocl;
}
interface OnClickListener {
public abstract void onClick();
}
void Click() {
ocl.onClick();
}
}
- 내부에 onClickListener라는 이너 인터페이스 정의 , ocl필드는 이 인터페이스의 타입
- setOnClickListener() 메서드
- 인터페이스 객체를 입력매개변수로 넘겨 받아 필드를 초기화
- Click() 메서드
- 초기화된 필드 객체 내부의 onClick() 메서드를 실행
- Buttun은 기능은 내부에서 정해지는 것이 아니라 외부에서 정해 입력받는 것
개발자 1. 클릭하면 음악 재생
public static void main(String[] args) {
Button button1 = new Button();
button1.setOnClickListener(new Button.OnClickListener() {
@override
public void onClick() [
System.out.println("개발자1. 음악재생");
}
});
button1.click();
}
개발자 2. 클릭하면 네이버 접속
public static void main(String[] args) {
Button button2 = new Button();
button2.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick() {
System.out.println("개발자2.네이버 접속");
}
});
button2.click();
}
- 버튼 객체 생성
- 익명 이너 클래스를 활용해 onClick()메서드를 오버라이딩
- 생성한 객체를 setOnClickListener() 메서드의 입력매개변수로 전달한 후 Button 객체의 click()메서드 호출
-API는 버튼의 기능을 정의할 수 있는 인터페이스를 클래스 내부에 정의해 사용
'Java' 카테고리의 다른 글
14 - 2장 예외 처리 (0) | 2023.06.13 |
---|---|
14 - 1장 예외 (0) | 2023.06.12 |
13 - 2 장 익명 이너 클래스 (0) | 2023.06.05 |
13 -1 장 이너 클래스 (0) | 2023.06.04 |
12 - 2장 인터페이스 (0) | 2023.06.04 |