지역 내부 클래스
package innerclass;
class Outer {
int outNum = 100;
static int sNum = 200;
Runnable getRunnable(int i) { // 메소드안에서 지역변수 사용시 Runnable 한 타입의 객체를 받는다. 매개변수도 지역변수 이다. 지역변수들은 상수가 된다.
// 지역변수는 메소드가 호출해서 끝날떄 까지
// 지역변수들은 다 상수가 된다. 변경을 못하게된다.
int num = 100; // 지역변수
class MyRunnable implements Runnable {
// 지역 내부 클래스가 된다.
@Override
public void run() {
// 로컬변수는 { } 안에서만 존재하고 메소드안에서 지역변수 사용시 상수가 되서 변경못한다.
System.out.println(num);
System.out.println(i);
System.out.println(outNum);
System.out.println(Outer.sNum);
}
}
return new MyRunnable();
}
}
public class LocalInnerClassTest {
public static void main(String[] args) {
Outer outer = new Outer();
Runnable runnable = outer.getRunnable(50);
runnable.run();
// 참조는 할수있지만 변경 시킬수는 없다.
}
}
익명 내부 클래스
package innerclass;
class Outer2 {
int outNum = 100;
static int sNum = 200;
Runnable getRunnable(int i) { // 메소드안에서 지역변수 사용시 Runnable 한 타입의 객체를 받는다. 매개변수도 지역변수 이다. 지역변수들은 상수가 된다.
// 지역변수는 메소드가 호출해서 끝날떄 까지
// 지역변수들은 다 상수가 된다. 변경을 못하게된다.
int num = 100; // 지역변수 내부클래스에서는 상수화된다.
return new Runnable() {
// Runnable 인터페이스를 바로 구현해서 클래스이름이 없어졌다 익명내부클래스
public void run() {
System.out.println(num);
System.out.println(i);
System.out.println(outNum);
System.out.println(Outer2.sNum);
}
}; // 구현의 끝
}
Runnable runner = new Runnable() {
// 단 하나의 추상클래스 또는 인터페이스 인 경우 클래스 없이 바로 new 키워드로 바로 생성할수있다.
@Override
public void run() {
System.out.println("test");
}
};
}
public class AnonymousInnerClassTest {
public static void main(String[] args) {
Outer2 outer = new Outer2();
outer.runner.run(); // 익명내부클래스는 바로 쓸수있다.
Runnable runnable = outer.getRunnable(50);
runnable.run(); // 참조는 할수있지만 변경 시킬수는 없다.
}
}
'JAVA Programming' 카테고리의 다른 글
[74] 스트림 이란 ? 중간연산(map,filter) , 최종연산(forEach) (0) | 2020.07.20 |
---|---|
[73] 람다식 이란? (0) | 2020.07.20 |
[71] 내부클래스 외부클래스 <인스턴스 내부클래스 , 정적 내부클래스 (0) | 2020.07.20 |
[70] 컬렉션 프레임워크 요약정리 (0) | 2020.07.20 |
[69] Map 에서의 HashMap 과 TreeMap (0) | 2020.07.20 |