Inner class로, 이름이 없는 클래스를 말하다.
클래스 정의와 동시에 객체를 생성할 수 있다.
Interface, AbstractClass 모두 익명 클래스로 객체를 만들 수 있다.
: 부모 클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.
오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만들 구현할 수 있다.
이름이 없기 때문에 생성자도 가질 수 없다.
인터페이스와 추상 클래스 내부의 모든 추상 메소드를 반드시 오버라딩 해야 함.
마지막}(종료중괄호) 뒤에 종료; (세미콜론)을 꼭 넣어준다.
외부에서 익명클래스의 멤버필드에는 접근 불가.
익명클래스 내부에 기술가능한 static의 경우:
익명 클래스를 사용하는 이유:
프로그램 내에서 한 번만 객체로 만드는 데 사용되는 클래스를 굳이 정의할 필요가 없기 때문
AWT, SWING, GUI, 이벤트 처리에 쓰임
외부에서 익명클래스의 멤버필드에 접근이 안되므로, 클래스 안에서 모두 처리되어야하는 경우만 익명 클래스를 사용한다.
형식:
new 부모클래스 이름(){
// 멤버선언 --> 익명클래스 기술
}
// 다른 방법
new 구현 인터페이스 이름() {
// 멤버선언 --> 익명클래스 기술
}
``
abstract class AnonyEx01Abstract{ // 추상클래스
public String s; // 멤버필드
public abstract void doSomething(); // 추상메소드 ---> 재정의를 하기 위해서
}
class ASub extends AnonyEx01Abstract{ // 상속받음
@Override
public void doSomething() {
System.out.println("ASub 클래스 doSomething()메소드 호출");
}
}
public class AnonyEx01Test { // 메인클래스
public static void main(String[] args) { // 메인메소드
int aa = 5; // 지역변수 --> 같은 이름으로 멤버변수에서 이미 선언되었던 변수를 선언할 수 있음.
final int AA = 7; // 지역상수
AnonyEx01Abstract myClass = new ASub() { // 익명클래스는 외부에서 접근 불가
private int a = 15; // 외부에서 접근 불가
String s = "AnonymousClass";
final int AA = 0; // 상수라는
// static fianl int AA = 0;
// static int st = 0;
@Override
public void doSomething() {
// aa = a+ aa; // 변수지만 상수처럼 한번도 변경되지 않아야 함.
super.doSomething();
System.out.println("내부 익명 클래스의 doSomething메소드");
System.out.println("s : " + s);
System.out.println("a : " + a);
System.out.println("aa : " + aa); // 외부변수도 끌어다 쓸 수 있음
System.out.println("AA : " + AA);
etcMethod(); // 형제관계 이거나 상속받은 부모의 메소드 이거나
}
public void etcMethod() {
System.out.println("기본 메소드입니다.");
}
};
myClass.doSomething();
// myClass.etcMethod(); // 접근 불가 자식 메소드이므로
// aa = aa+15;
System.out.println("aa: "+aa);
System.out.println(myClass.s); // 추상클래스에 있는 s가 출력
}
}