클래스 내부에 선언한 클래스와 인터페이스
class MyClass {
class NestedMyClass{ int field1; void method1() { } } // 중첩 클래스
interface NestedMyInterface{ } // 중첩 인터페이스
}
// MyClass 외부에서 NestedMyClass(인스턴스 멤버 클래스)의 객체를 생성하려면
// 먼저 MyClass 객체를 생성하고 NestedMyClass 객체를 생성해야한다.
MyClass myclass = new MyClass();
MyClass.NestedMyClass nestedmyclass = myclass.new NestedMyClass();
nestedmyclass.field1 = 3;
nestedmyclass.method1();
// static 키워드로 정적 멤버 클래스도 생성 가능하다.
// static 특징처럼 따로 MyClass 객체를 생성할 필요가 없다.
MyClass.NestedMyClass nestedmyclass = new MyClass.NestedMyClass(); // static으로 NestedMyClass 선언할 경우
// 클래스 내부의 메소드 내부에서도 선언 가능하다.
// 메소드 내에서만 사용하기 때문에 static 과 접근 제한자를 붙일 수 없다.
class A{
void method(){
class B{ } // 중첩 클래스
}
}
이름이 없는 객체 의미한다.
프로그램에서 일시적으로 한번만 사용되고 버려지는 객체이다.
(재사용이 되지 않는다)
단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야만 생성 가능하다.
하나의 실행문이므로 끝에는 세미콜론(;)을 반드시 붙여야 한다.
부모클래스 [필드|변수] = new 부모클래스(매개값, ... ) {
// 필드
//메소드
};
// 부모 클래스
// 일시적으로 정의된 익명객체를 담아둘 변수로 사용되기도 하고
// 익명객체가 무엇을 재정의해야할지 어느정도 컨셉을 잡아주는 역할(상속개념)
public class Insect{
void attack(){
System.out.println("곤충을 공격을 한다");
}
}
public class Anoymous{
// 방법 1 : 필드에 익명자식 객체를 생성
Insect spider1 = new Insect(){
String name = "무당거미";
// 거미줄을 치다
void cobweb(){
System.out.println("사각형으로 거미줄을 친다.");
}
@Override
void attack(){
System.out.println(name + "독을 발사한다.");
cobweb();
}
};
// 방법 2 : 로결변수의 초기값으로 대입
void method1(){
Insect spider2 = new Insect(){
String name = "늑대거미";
// 거미줄을 치다
void cobweb(){
System.out.println("육각형으로 거미줄을 친다.");
}
@Override
void attack(){
System.out.println(name + "앞니로 문다.");
}
};
// 로컬변수이기 때문에 메서드에서 바로 사용 가능
spider2.attack();
}
// 방법 3 : 익명객체 매개변수로 대입
void method2(Insect spider){
spider.attack();
}
}
// 사용
public static void main(String[] args) {
Anoymous a = new Anoymous();
// 방법 1 : 익명객체 필드 사용
a.spider1.attack();
// 방법 2 : 익명개체 로컬 변수 사용
a.method1();
// 방법 3 : 매개변수로 익명객체 사용
a.method2(new Insect(){
String name = "타란툴라";
// 거미줄을 치다
void cobweb(){
System.out.println("그냥 마구잡이로 거미줄을 친다.");
}
@Override
void attack(){
System.out.println(name + " 공격 안하고 후퇴힌다.. ");
};
});
}
일반 클래스와의 차이점은 생성자를 선언할 수 없다는 것이다.
읽을 때는 이해가 되지만, 점점 갈수록 "그래서 이게 무슨 의미지?"라는 생각이 든다. 실제로 예제를 직접 적용해보면서 익혀야 제대로 이해가 되는 것 같다.