지난번 단원은 정석의 키워드만 보고 공식 문서 찾아다니면서 읽으니까 뭔가 덜 수동적인 거 같은 느낌이 들어서, 앞으로는 섞어서 내용을 작성해볼까 한다.
= 클래스 내에 선언된 클래스 (JDK 1.1 이후 추가된 개념)
(내부 클래스 예시)
class A { //A는 외부 클래스
//...
class B { //B는 내부 클래스
//...
}
}
= 변수의 선언위치
에 따라 갈림!
class Outer {
class InstanceInner {}
static class StaticInner {}
void myMethod() {
class LocalInner {}
}
}
위의 내부 클래스 선언 예시에서 InstanceInner
와 StaticInner
는 Outer
의 멤버변수와 같은 위치에 선언되며, 같은 성질을 갖는다.
=> 따라서 인스턴스 멤버과 static 멤버간의 규칙이 내부 클래스에도 똑같이 적용된다.
class InnerEx1 {
class InstanceInner {
int iv = 100;
final static int CONST = 100;
}
static class StaticInner {
int iv = 200;
static int cv = 200;
}
void myMethod() {
class LocalInner {
int iv = 300;
}
}
public static void main(String[] args) {
System.out.println(InstanceInner.CONST);
System.out.println(StaticInner.cv);
}
//출력결과
//100
//200
}
StaticInner
만 static 멤버를 가질 수 있다.class InnerEx2 {
class InstanceInner {}
static class StaticInner {}
InstanceInner iv = new InstanceInner();
static StaticInner cv = new StaticInner();
static void staticMethod() {
StaticInner obj2 = new StaticInner();
}
}
void myMethod() {
int lv = 0;
final int LV = 0;
class LocalInner {
int liv = outerIv;
int liv2 = outerCv;
int liv3 = lv; //에러 발생!!!!!!
int liv4 = LV;
}
}
class Outer {
class InstanceInner {
int iv = 100;
}
static class StaticInner {
int iv = 200;
static int cv = 300;
}
void myMethod() {
class LocalInner {
int iv = 400;
}
}
}
class InnerEx4 {
public static void main(String[] args) {
Outer oc = new Outer();
Outer.InstanceInner ii = oc.new InstanceInner();
System.out.println("ii.iv: "+ii.iv);
System.out.println("Outer.StaticInner.cv: "+Outer.StaticInner.cv);
Outer.StaticInner si = new Outer.StaticInner();
System.out.println("si.iv : "si.iv);
}
}
------
InnerEx4.class
Outer.class
Outer$InstanceInner.class
Outer$StaticInner.class
Outer$1LocalInner.class
컴파일 시 '외부 클래스명$내부 클래스명.class' 형태로 파일명 생성됨
= 일회용 클래스(클래스의 선언과 객체의 생성을 동시에 하므로 단 한번만 사용)
= new 조상클래스이름() {}
or new 구현인터페이스이름() {}
class InnerEx6 { //세가지 모두 익명클래스
Object iv = new Object() {void method(){} };
static Object cv = new Object() {void method() {} };
void myMethod() {
Object lv = new Object() {void method() {} };
}
}
외부클래스명$숫자.class
로 파일명 결정import java.awt.*;
class InnerEx8 {
public static void main(String[] args) {
Button b = new Button("start");
b.addActionListner(new ActionListner() {
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent occured!!!");
}
} //익명 클래스 끝
}
}
자바의 정석, 2nd Edition.