Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch12. 내부 클래스(2) 본문

JAVA 문법

Ch12. 내부 클래스(2)

밍응애 2021. 2. 27. 22:43

* 익명 이너클래스

- 하나의 인터페이스나 하나의 추상클래스에 대해서 바로 생성을 할 수 있다

(원래 인터페이스나 추상클래스를 생성하려면 상속을 받은 클래스를 만들고 생성해서 써야하는 데)

 

--> 안드로이드 위젯 핸들링할 때 (버튼이나 텍스트 박스 등) 화면 터치나 클릭하는 일들이 있는데, 거기서 사용되는 모든 위젯 핸들러들을 이런 익명 이너클래스를 사용

 

 

- 지역 내부 클래스 예제

# 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");
			
		}
	};