1. 지역(Local) 내부 클래스
2. 지역 내부 클래스 구현
class Outer{ ##### 외부 클래스 #####
int outNum = 100;
static int sNum = 200;
Runnable getRunnable(int i){ # 외부 클래스의 일반 메서드, 매개변수 i
int num = 100; # 메서드의 로컬 변수 num
class MyRunnable implements Runnable{ ##### 지역 내부 클래스 #####
int localNum = 10;
@Override
public void run() {
//num = 200; # 에러 (자동으로 final로 바뀜)
//i = 100; # 에러 (자동으로 final로 바뀜)
System.out.println("i =" + i);
System.out.println("num = " +num);
System.out.println("localNum = " +localNum);
System.out.println("outNum = " + outNum + "(외부 클래스 인스턴스 변수)");
System.out.println("Outter.sNum = " + Outer.sNum + "(외부 클래스 정적 변수)");
}
}
return new MyRunnable();
}
}
public class LocalInnerTest {
public static void main(String[] args) {
Outer out = new Outer();
Runnable runner = out.getRunnable(10); # 여기서 메서드 호출이 끝남
runner.run(); # run 메서드는 getRunnable 메서드의
} # 매개변수 지역변수에 접근하므로 final 처리됨
}
1. 익명 (Anonymous) 내부 클래스
2. 익명 클래스 구현
class Outter2{
Runnable getRunnable(int i){
int num = 100;
return new Runnable() { ##### 익명 내부 클래스 #####
@Override
public void run() {
System.out.println(i);
System.out.println(num);
}
}; ##### 이 부분까지 클래스 정의 #####
}
Runnable runner = new Runnable() { ##### 익명 내부 클래스 #####
@Override
public void run() {
System.out.println("Runnable 이 구현된 익명 클래스 변수");
}
};
}
public class AnonymousInnerTest {
public static void main(String[] args) {
Outter2 out = new Outter2();
Runnable runnerble = out.getRunnable(10);
runnerble.run();
out.runner.run();
}
}