Java inner class , inner interface.

Java inner class , inner interface.

중첩 클래스 , 중첩 인터페이스.

중첩 클래스는 클래스 블록 안에 클래스가 있는 것이다.

A라는 클래스 안에 B라는 클래스를 생성할 때.

class A {

// 바깥 클래스

A() {

system.out.println("A");

}

// 인스턴스 멤버 클래스

public class B {

B(){

system.out.println("B");

}

int field1;

void method1(){}

}

//정적 멤버 클래스

static class C {

C(){

system.out.println("C");

}

int field1;

static int field2;

void method1(){ }

static void method2(){ }

}

//로컬 클래스

void method(){

class D {

D(){

system.out.println("D");

}

int field1;

void method1(){ }

}

D d = new D();

d.field1 = 1;

d.method1();

}

} // A클래스 끝.

생성할 수 있다.

중첩 클래스 바깥 클래스 참조 얻기

클래스 내부에서는 this는 객체 자신의 참조이다. 하여 바깥 클래스의 객체를 얻으려면

바깥 클래스의 이름을 this 앞에 붙이고 바깥 클래스의 필드와 메소드에 접근하기위해 this뒤에는 해당 바깥 클래스이 메소드 필드 이름을 적는다. 바깥 클래스. this. 바깥 클래스 메소드, 필드 이름

예시.

public class AB {

String field = "AB-field";

void method() {

System.out.println("AB-method");

}

class No{

String field = "No-field";

void method() {

System.out.println("No-method");

}

void print() {

System.out.println(this.field); // 내부 클래스 참조

this.method(); // 동일

System.out.println(AB.this.field); // 바깥 클래스 참조 얻기.

AB.this.method(); // 동일

}

}

} public class ABoutterExample {

public static void main(String[] args) {

AB ab = new AB();

AB.No ne = ab.new No();

ne.print();

}

}

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

인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위함이다

특히 UI 프로그램에서 이벤트 처리 목적으로 많이 활용된다. button클릭 시 이베트 처리하는 객체를 받는다고 가정.

아무 객체나 받으면 안 되고 button 내부에 선언된 중첩 인터페이스를 구현한 객체만 받아야 한다면

public class Button {

OnClickListener listener; // 인터페이스 타입 필드

// 매개변수의 다형성

void setOnClickListener(OnClickListener listener) {

this.listener = listener;

}

void touch() {

// 구현 객체 onclick 메소드 호출

listener.OnClick();

}

//중첩 인터페이스

interface OnClickListener{

void OnClick();

}

} 구현 객체를 만들어보자

public class CallListener implements Button.OnClickListener {

@Override

public void OnClick() {

System.out.println("전화걸기");

} public class ButtonExample {

public static void main(String[] args) {

Button bth = new Button();

bth.setOnClickListener(new CallListener());

bth.touch();

}

}

익명 객체는 이름 없는 객체이고 익명 객체는 단독으로 생성할 수없다.

하여 클래스를 상속하거나 인터페이스를 구현해야만 생성할수 있고 익명 객체는 필드의 초기 값이나 로컬 변수의 초기값 매개변수의 매개 값으로 주로 대입된다. UI이벤트 처리 객체나 스레드 객체를 간편하게 생성할 목적으로 익명 객체가 많이 활용되고 실행문이므로 끝에는 ; (세미콜론)을 반드시 붙여야 한다.

예시. 상위 클래스

public class person {

void wake() {

System.out.println("7시 일어난다아");

}

} public class Anonymous {

//필드 초기 값으로 대입

person field = new person() {

void work() {

System.out.println("출근한다아");

}

@Override

void wake() {

System.out.println("6시 일어난다아");

work();

}

};

void method1() {

// 로컬변수값으로 대입

person localvar = new person() {

void walk() {

System.out.println("산책한다아");

}

@Override

void wake() {

System.out.println("7시 일어난다아");

walk();

}

};

//로컬변수 사용

localvar.wake();

}

void method2(person person) {

person.wake();

}

}

public class AnonymousExample {

public static void main(String[] args) {

Anonymous am = new Anonymous();

// 익명 객체 필드사용

am.field.wake();

// 익명 객체 로컬변수사용

am.method1();

// 익명 객체 매개값 사용

am.method2(

new person() {

void study() {

System.out.println("공부한다아");

}

@Override

void wake() {

System.out.println("8시 일어난다아");

study();

}

}

);

}

}

인터페이스 타입으로

public interface inter {

public void turnon();

public void turnoff();

} public class anym {

//필드 초기값으로 대입

inter a = new inter() {

@Override

public void turnon() {

System.out.println("tv켜");

}

@Override

public void turnoff() {

System.out.println("tv꺼");

}

}; // 필드 선언과 초기값 대입

// 로컬 변수 값으로 대입

void method1() {

inter b = new inter() {

@Override

public void turnon() {

System.out.println("auoid켜");

}

@Override

public void turnoff() {

System.out.println("auoid꺼");

}

};

//로컬변수 사용

b.turnon();

}

void method2(inter a) {

a.turnon();

}

} public class anymexample {

public static void main(String [] args) {

anym ab = new anym();

//익명 객체 필드 사용

ab.a.turnon();

// 익명 객체 로컬변수 사용

ab.method1();

// 익명 객체 매개값 사용

ab.method2(

new inter() {

@Override

public void turnon() {

System.out.println("smartTv켜");

}

@Override

public void turnoff() {

System.out.println("smartTv꺼");

}

}

);

}

}

from http://workerst.tistory.com/34 by ccl(A) rewrite - 2021-10-18 14:27:39