-
[Java 자바] 9. 중첩 ② 중첩 인터페이스, 익명 객체Programming/Java 2022. 8. 9. 20:51반응형
9-3. 중첩 인터페이스
- 클래스 멤버로 선언된 인터페이스를 의미
- 클래스 내부에 선언함으로써 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해 사용
- 특히 UI프로그래밍에서 이벤트를 처리할 목적으로 자주 활용됨//Button.java public class Button { // 인터페이스 타입 필드 OnClickListener listener; // 매개 변수의 다형성 void setOnClickListener(OnClickListener listener) { this.listener = listener; } // 구현 객체의 onClick() 메소드 호출 void touch() { listener.onClick(); } // 중첩 인터페이스 interface OnClickListener { void onClick(); } } //CallListener.java public class CallListener implements Button.OnClickListener { @Override public void onClick() { System.out.println("전화를 겁니다."); } } //MessageListener.java public class MessageListener implements Button.OnClickListener { @Override public void onClick() { System.out.println("메시지를 보냅니다."); } } //ButtonTest.java public class ButtonTest { public static void main(String[] args) { Button btn = new Button(); btn.setOnClickListener(new CallListener()); btn.touch(); btn.setOnClickListener(new MessageListener()); btn.touch(); } }
9-4. 익명 객체
- 익명객체란 이름이 없는 객체로, 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있음
9-4-1. 익명 자식 객체 생성
- 자식 클래스가 재사용되지 않고, 오로지 특정 필드와 변수의 초기값으로만 사용할 경우라면 익명 자식 객체를 생성하여 대입
- 끝에 세미클론(;)을 반드시 붙여야 함// 자식 객체를 사용하여 필드와 로컬 변수에 자식 객체를 대입 class Child extends Parents { } class A { Parent field = new Child(); void method() { Parent localVar = new Child(); } } // 위의 코드를 익명 객체를 활용하여 변경하면 아래와 같이 변경 가능 // 1. 필드 선언시 초기값으로 익명 자식 객체를 생성하여 대입 class A { Parent field = new Parent() { int childField; void childMethod() { } @Override void parentMethod() { } }; } // 2. 로컬 변수 선언시 초기값으로 익명 자식 객체를 생성하여 대입 class A { void method() { Parent localVar = new Parent() { int childField; void childMethod() { } @Override void parentMethod() { } }; } }
9-4-2. 익명 구현 객체 생성
- 인터페이스 타입으로 필드나 변수를 선언하고, 구현 객체를 초기값으로 대입하는 경우
//인터페이스 타입으로 필드 변수 선언 후, 구현 객체를 초기값으로 대입하는 경우 class TV implements RemoteControl { } class A { // 1. 필드에 구현 객체를 대입 RemoteControl field = new TV(); // 2. 로컬 변수에 구현 객체를 대입 void method() { RemoteControl localVar = new TV(); } } //구현클래스가 재사용되지 않고, 오로지 초기값으로 사용되는 경우 익명 구현 객체를 초기값으로 대입 // 1. 필드 선언시 초기값으로 익명 구현 객체 생성 후 대입 class A { RemoteControl field = new RemoteControl() { @Override void turnOn() { } }; } // 2. 메소드 내에서 로컬 변수를 선언할 때 초기값으로 익명 구현 객체 생성 후 대입 class A { RemoteControl localVar = new RemoteControl() { @Override void turnOn() { } }; } // 3. 메소드의 매개변수가 인터페이스 타입일 경우, // 메소드 호출 코드에서 익명 구현 객체를 생성하여 매개값으로 대입 class A { void method1(RemoteControl rc) { } void method2() { method1( new RemoteControl() { @Override void turnOn(){ } } }; } }
9-4-3. 익명 객체의 로컬 변수 사용
- 익명 객체 내부에서 메소드의 매개 변수나 로컬 변수를 사용할 경우, 이 변수들은 final 특성을 갖게 됨
//Calculatable.java public interface Calculatable { public int sum(); } //Anonymous.java public class Anonymous { private int field; public void method(final int arg1, int arg2) { final int var1 = 0; int var2 = 0; field = 10; //arg1 = 20; (x) //arg2 = 20; (x) //var1 = 30; (x) //var2 = 30; (x) Calculatable calc = new Calculatable() { @Override public int sum() { int result = field + arg1 + arg2 + var1 + var2; return result; } }; System.out.println(calc.sum()); } } //AnonymousTest.java public class AnonymousTest { public static void main(String[] args) { Anonymous anony = new Anonymous(); anony.method(0, 0); } }
반응형'Programming > Java' 카테고리의 다른 글
[Java 자바] 11. 기본 API 클래스 ② Object 클래스 (2) 2022.08.09 [Java 자바] 11. 기본 API 클래스 ① java.lang, java.util (0) 2022.08.09 [Java 자바] 9. 중첩 ① 중첩 클래스 (0) 2022.08.09 [Java 자바] 8. 인터페이스 ② 사용 방법, 인터페이스 상속, 디폴트 메소드 (0) 2022.08.09 [Java 자바] 8. 인터페이스 ① 선언과 구현 (0) 2022.08.09