안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
이름이 없는 객체.
클래스를 상속하거나 인터페이스를 구현해야지만 생성할 수 있습니다.
익명 객체는 필드의 초기값이나 로컬 변수의 초기값, 매개 변수의 매개값으로 주로 대입됩니다.
UI 이벤트 처리 객체나 스레드 객체를 간편하게 생성할 목적으로 많이 활용.
익명 자식 객체 생성
부모 타입으로 필드나 변수를 선언하고 자식 객체를 초기값으로 대입하는 경우.
부모 클래스를 상속해서 자식 클래스를 선언하고, new 연산자를 이영해서 자식 객체를 생성한 후 ,
필드나 로컬 변수에 대입하는 것이 일반적임.
class Child extends Parent { } //자식 클래스 선언
class A {
Parent field = new Child(); // 필드에 자식 객체를 대입
void method() {
Parent localVar = new Child(); // 로컬 변수에 자식 객체를 대입
}
}
자식 클래스가 재사용되지 않고, 해당 필드와 변수의 초기값으로만 사용할 경우
익명 자식 객체를 생성해서 초기값으로 대입하는 것이 좋은 방법입니다.
주의할 점은 하나의 실행문이므로 끝에는 세미콜론을 꼭 붙여주어야 합니다.
부모클래스 [필드|변수] = new 부모클래스(매개값,...) {
//필드
//메서드
};
부모클래스(매개값,...) { } : 부모 클래스를 상속해서 중괄호 { } 와 같이 자식 클래스를 선언하라는 뜻이고, new 연산자는 이렇게 선언된 자식 클래스를 객체로 생성합니다.
부모클래스(매개값,...) : 부모 생성자를 호출하는 코드,매개 값은 부모 생성자의 매개 변수에 맞게 입력
중괄호 { } 내부에는 필드나 메서드를 선언하거나 부모 클래스의 메서드를 오버라이딩하는 내용이 옴
일반 클래스와 차이점 : 생성자를 선언할 수 없음.
필드를 선언할 때 초기값으로 익명 자식 객체를 생성해서 대입하는 코드
class A {
Parent field = new Parent() { // A 클래스의 필드 선언
int childField;
void childMethod() { }
@Override // parent의 메서드를 오버라이딩
void parentMethod() { }
};
}
로컬 변수를 선언할 때 초기값으로 익명 자식 객체를 생성해서 대입하는 코드
class A {
void method(){
Parent localVar = new Parent() { // 로컬 변수 선언
int childField;
void childMethod() { }
@Override // parent의 메서드를 오버라이딩
void parentMethod() { }
};
}
}
메서드의 매개 변수가 부모 타입일 경우
=> 메서드 호출 코드에서 익명 자식 객체를 생성해서 매개값으로 대입할 수도 있다.
class A {
void method1(Parent parent) { }
void method2() {
method1(
new Parent() { //method1의 매개 값으로 익명 자식 객체 대입
int childField;
void childMethod() { }
@Override
void parentMethod() { }
}
);
}
}
예제
부모 클래스
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 anony = new Anonymous();
//익명 객체 필드 사용
anony.field.wake();
//익명 객체 로컬변수 사용
anony.method1();
//익명 객체 매개값 사용
anony.method2(
new Person() { // 매개 값
void study() {
System.out.println("공부합니다.");
}
@Override
void wake() {
System.out.println("8시에 일어납니다.");
study();
}
}
);
}
}
'자바' 카테고리의 다른 글
JAVA 자바 익명 객체의 로컬 변수 사용 (0) | 2017.03.13 |
---|---|
JAVA 자바 익명 구현 객체 생성 (0) | 2017.03.13 |
JAVA 자바 중첩 인터페이스 Interface (0) | 2017.03.13 |
JAVA 자바 중첩 클래스: 중첩 클래스의 접근 제한 - 로컬 클래스에서 사용 제한 / 중첩 클래스에서 바깥 클래스 참조 얻기 (0) | 2017.03.13 |
JAVA 자바 중첩 클래스 : 중첩 클래스의 접근 제한 - 바깥 필드와 메서드에서 사용 제한, 멤버 클래스에서 사용 제한 (0) | 2017.03.13 |