Java/Java
자바[Java] 내부 클래스(inner)와 내부 인터페이스란
백엔드 신입사원( soft 5.10 입사)
2021. 10. 18. 14:23
반응형
중첩 클래스 , 중첩 인터페이스
중첩 클래스는 클래스 블록 안에 클래스가 있는 것입니다. 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 프로그램에서 이벤트 처리 목적으로 많이 활용됩니다. 버튼을 클릭 시 이벤트 처리하는 객체를 받는다고 가정한다면 아무 객체나 받으면 안 되고 버튼 내부에 선언된 중첩 인터페이스를 구현한 객체만 받아야 합니다. 아래 코드는 예시 코드입니다.
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꺼");
}
}
);
}
}
반응형