📚 자바의 정석을 정리한 내용입니다.
내부 클래스는 단순히 클래스 내에 선언된 클래스다.
위 다이어그램에서 보다시피 내부 클래스는 클래스의 멤버처럼 다룬다. 다른 점은 익명 클래스Anonymous class가 있다.
자바의 정석 예제에 간단히 주석을 달았습니다.
class Outer {
class InstanceInner {
int iv = 100;
}
static class StaticInner {
int iv = 200;
static int cv = 300;
}
void myMethod() {
class LocalInner {
int iv = 400;
}
}
}
public class InnerEx4 {
public static void main(String[] args) {
/*
* 인스턴스내부클래스의 인스턴스를 생성하려면
* 외부클래스의 인스턴스가 먼저 필요하다.
* */
Outer outer = new Outer();
Outer.InstanceInner instanceInner = outer.new InstanceInner();
System.out.println("instanceInner.iv : " + instanceInner.iv);
System.out.println("Outer.StaticInner.cv : " + Outer.StaticInner.cv);
/*static 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 된다.*/
Outer.StaticInner staticInner = new Outer.StaticInner();
System.out.println("staticInner.iv : " + staticInner.iv);
System.out.println("staticInner.iv : " + staticInner);
}
}
익명클래스는 이름 없는 내부 클래스다. 이름이 없으므로 객체를 생성할 수 없고, 재사용할 수도 없다.
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Anonymous {
public static void main(String[] args) {
Button button = new Button("Start");
}
}
class EventHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent Occured!");
}
}
이런 코드를
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Anonymous {
public static void main(String[] args) {
Button button = new Button("Start");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent occurred!!!");
}
});
}
}
익명클래스를 이용해서 이렇게 변경할 수 있다.