Java 내부 클래스 (2)

Codren·2021년 6월 4일
0

내부 클래스

목록 보기
2/2

Section 1. 지역 내부 클래스

1. 지역(Local) 내부 클래스

  • 지역 변수와 같이 메서드 내부에 정의하여 사용하는 클래스
  • 메서드의 호출이 끝나면 사용된 지역변수의 유효성은 사라짐 (스택 영역에 생성 및 제거)
  • 메서드 호출이 끝난 이후에도 사용해야 하는 변수가 있을 수 있으므로 지역 내부 클래스에서 사용되는 로컬 변수나 매개 변수는 final로 선언됨




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 처리됨
}



Section 2. 익명 내부 클래스

1. 익명 (Anonymous) 내부 클래스

  • 이름이 없는 클래스
  • 위에서 지역 내부 클래스의 MyRunnable 클래스 이름은 실제로 호출되는 경우가 없음
  • 클래스의 이름을 생략하고 주로 하나의 인터페이스나 하나의 추상 클래스를 구현하여 반환
  • 인터페이스나 추상 클래스 자료형의 레퍼런스 변수에 직접 대입하면서 클래스를 생성하거나 지역 내부 클래스의 메서드 내부에서 생성하여 반환 할 수 있음.




2. 익명 클래스 구현

  • 위의 Outer 클래스 수정
  • class '클래스 이름' {} 이런 클래스 선언 및 정의 단계 생략하고 바로 인스턴스 생성
    (extends, implements 생략)
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();
	}
}

0개의 댓글

관련 채용 정보