public class Main {
// 클래스 안에 인스턴스 변수(필드)를 선언하는 위치에 선언된 경우
// 중첩 클래스, 인스턴스 클래스
class Cal {
int value = 0;
public void plus() {
value++;
}
}
public static void main(String[] args) {
// 내부에 있는 Cal 객체를 생성하기 위해 밖에 Main 객체를 생성하고,
// Main.Cal cal = main.new Cal();와 같은 방법으로 Cal 객체를 생성한 뒤 사용한다.
Main main = new Main();
Main.Cal cal = main.new Cal();
cal.plus();
System.out.println(cal.value);
}
}
public class Main {
static class Cal {
int value = 0;
public void plus() {
value++;
}
}
public static void main(String[] args) {
// 이 경우 Main 객체 생셩할 필요없이 Main.Cal()로 객체를 생성하여 사용한다.
Main.Cal cal = new Main.Cal();
cal.plus();
System.out.println(cal.value);
}
}
public class Main {
public void exec() {
class Cal {
int value = 0;
public void plus() {
value++;
}
}
// 메서드 내에서 해당 클래스를 생성하여 사용한다.
Cal cal = new Cal();
cal.plus();
System.out.println(cal.value);
}
public static void main(String[] args) {
Main main = new Main();
main.exec();
}
}
생성자 다음에 중괄호 열고 닫고가 나오면 해당 생성자 이름에 해당하는 클래스를 상속받는 이름없는 개체를 만든다는 것을 의미한다.
익명 클래스를 만드는 이유는 Action을 상속받는 클래스를 만들 필요가 없는 경우이다.
public abstract class Action {
public abstract void exec();
}
public class Main {
public static void main(String[] args) {
Action action = new Action() {
// Action을 상속받은 클래스가 굳이 필요없을 때(한 번만 쓰고 마는 경우)
// 이처럼 익명 클래스를 사용한다.
// 해당 괄호 내, 메서드를 구현하거나 추가하여 구현한다.
@Override
public void exec() {
System.out.println("exec 수행");
}
};
action.exec();
}
}