JAVA Programming

[72] 익명내부클래스 , 지역내부클래스

꾸준히개발하자 2020. 7. 20. 19:49

 

지역 내부 클래스 

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(); // 참조는 할수있지만 변경 시킬수는 없다. 
	
	
	}
}