Super Coding Addict
Ch12. 내부 클래스(2) 본문
* 익명 이너클래스
- 하나의 인터페이스나 하나의 추상클래스에 대해서 바로 생성을 할 수 있다
(원래 인터페이스나 추상클래스를 생성하려면 상속을 받은 클래스를 만들고 생성해서 써야하는 데)
--> 안드로이드 위젯 핸들링할 때 (버튼이나 텍스트 박스 등) 화면 터치나 클릭하는 일들이 있는데, 거기서 사용되는 모든 위젯 핸들러들을 이런 익명 이너클래스를 사용
- 지역 내부 클래스 예제
# LocalInnerClass 클래스
package ch12.innerclass;
class Outer{
int outNum = 100;
static int sNum = 200;
Runnable getRunnable(int i) {
int num = 100; //상수 (i도 상수임)
class MyRunnable implements Runnable{ //지역내부클래스
@Override
public void run() {
//* num += 10; --> 상수(final)이므로 변경 불가
//* i = 200; --> 상수이므로 변경 불가
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();
}
}
--> getRunnable() 메서드 안에 선언한 MyRunnable 클래스가 지역 내부 클래스이다
--> 이 때 getRunnable()메서드에서 인자로 넘어온 i와 메서드 안에서 선언한 변수 num은 지역변수로 메서드가 종료되면 더이상 유효하지 않은 상수이다 (final)
=> 따라서 메서드 안에서 참조만 가능할 뿐 변경이 불가능하다 !
- 익명 이너클래스 예제
# AnonymousInnerClassTest 클래스
package ch12.innerclass;
class Outer2{
int outNum = 100;
static int sNum = 200;
Runnable getRunnable(int i) {
int num = 100;
return new Runnable(){ //익명 이너클래스
@Override
public void run() {
System.out.println(num);
System.out.println(i);
System.out.println(outNum);
System.out.println(Outer.sNum);
}
};
}
Runnable runner = new Runnable() {
@Override
public void run() {
System.out.println("test");
}
};
}
public class AnonymousInnerClassTest {
public static void main(String[] args) {
Outer2 outer = new Outer2();
Runnable runnable = outer.getRunnable(50);
runnable.run();
outer.runner.run();
}
}
--> 메서드 호출 시 생성해서 반환하거나, 변수에 대입하여 직접 구현한다
--> 구체적으로 살펴보면,
# 메서드 호출 시 생성하여 반환
Runnable getRunnable(int i) {
int num = 100;
return new Runnable(){ //익명 이너클래스
@Override
public void run() {
System.out.println(num);
System.out.println(i);
System.out.println(outNum);
System.out.println(Outer.sNum);
}
};
}
--> getRunnable()메서드 호출 시 생성된 Runnable 객체가 바로 익명 이너 클래스이다
--> main에서 Outer객체 생성 후 getRunnable()메서드를 호출하여 반환 받은 익명 이너클래스에서 run()메서드를 실행하면 된다
# 변수에 대입하여 직접 구현
Runnable runner = new Runnable() {
@Override
public void run() {
System.out.println("test");
}
};
'JAVA 문법' 카테고리의 다른 글
Ch10. 자바 기본 클래스 (2) - Object 클래스 (0) | 2021.03.01 |
---|---|
Ch10. 자바 기본 클래스 (1) - Object 클래스 (0) | 2021.02.28 |
Ch12. 내부 클래스(1) (0) | 2021.02.27 |
Ch11. 컬렉션 프레임워크 (6) (0) | 2021.02.27 |
Ch11. 컬렉션 프레임워크 (5) (0) | 2021.02.25 |