반응형
익명 객체
클래스 이름이 없는 객체를 익명 객체라고 부르고 어떤 클래스를 상속하거나 인터페이스를 구현해야한다.
//이름이 있는 객체의 상속
public class Class_Name extends Main_C {}
Main_C var = new Class_Name();
//익명 객체의 상속
Main_C var = new Main_C() {}; //괄호 안에는 익명 객체의 내용이 들어감
//이름이 있는 객체의 구현
public class Class_N implements I {}
I var = new Class_N();
//익명 객체의 구현
I var = new I() {};
익명 자식 객체의 사용
- 필드 선언할 때 초기값으로 익명 자식 객체를 생성하여 대입!
public class Main {
Parent field = new Parent(){
int childField;
void childMethd(){}
//부모 객체의 메소드 재정의
@Override
void parentMethd(){}
};
}
- 메소드 내에서 로컬 변수 선언 시 초기값으로 대입!
public class Main {
void methd(){
Parent local = new Parent(){
int childField;
void childMethd(){}
//부모 객체의 메소드 재정의
@Override
void parentMethd(){}
};
}
}
- 매개 변수의 매개값으로 익명 자식 객체를 생성하여 대입!
public class Main {
void methd1(Parent parent){}
void methd2(){
methd1(
new Parent(){
int childField;
void childMethd(){}
//부모 객체의 메소드 재정의
@Override
void parentMethd(){}
}
);
}
}
추가로 익명 자식 객체의 경우에 내부에서 선언한 필드나 메소드는 외부에서 사용할 수 없고 오직 부모 객체가 갖고 있는 필드와 메소드만 외부에서 사용이 가능!
public class Main {
Parent field = new Parent(){
int childField;
void childMethd(){}
//부모 객체의 메소드 재정의
@Override
void parentMethd(){}
};
void method(){
field.childField=1; //접근 불가능
field.childMethd(); //접근 불가능
fieled.parentMethd(); //익명 객체에서 재정의한 내용이 불러와짐
}
}
익명 구현 객체 사용
- 필드 선언 시 초기값으로 익명 구현 객체를 생성하여 대입하는 경우
public class Main {
//Interface라는 이름을 가진 인터페이스의 익명 구현 객체
Interface field = new Interface(){
//인터페이스 내에 있는 메소드 재정의
@Override
void test(){}
};
}
- 메소드 내에서 로컬 변수 선언시 초기값으로 익명 구현 객체 생성하여 대입
public class Main {
void method(){
//Interface라는 이름을 가진 인터페이스의 익명 구현 객체
Interface local = new Interface(){
//인터페이스 내에 있는 메소드 재정의
@Override
void test(){}
};
}
}
- 매개 변수의 매개값으로 대입하는 경우
public class Main {
void method1(Interface interface){}
void method2(){
method1(
//Interface라는 이름을 가진 인터페이스의 익명 구현 객체
new Interface(){
//인터페이스 내에 있는 메소드 재정의
@Override
void test(){}
}
);
}
}
추가로 메소드의 매개변수나 로컬 변수를 익명 객체 내부에서 사용할 때 이 변수들은 final 특성을 갖게 된다.
그 이유는 메소드가 종료되어도 익명 객체는 계속 실행 상태로 존재할 수 있기 때문에 그 값들이 변경되면 안됨!
public class Main {
public void method(final int arg1, int arg2){
final int var1=0;
int var2=1;
Parent sum = new Parent(){
//부모 객체의 메소드 재정의
@Override
void parentMethd(){int res = arg1+arg2+var1+var2;}
};
// 아래처럼 변수의 값을 바꾸는것이 안됨!
arg1=1;
arg2=2;
var1=1;
var2=2;
}
}
# 참고로 익명 자식 객체나 익명 구현 객체의 경우 특정 위치에서 사용될 때 주로 사용된다!
반응형
'Language > Java' 카테고리의 다른 글
Java 예외 처리 (0) | 2022.06.12 |
---|---|
Java 예외 클래스 (0) | 2022.06.12 |
Java 중첩 클래스와 중첩 인터페이스 (0) | 2022.06.11 |
Java 타입 변환과 다형성 (0) | 2022.06.06 |
Java 인터페이스 (0) | 2022.05.30 |