내부 클래스 (inner class) - 지역 내부 클래스, 익명 클래스

이진석·2022년 8월 18일
1
post-thumbnail

20220818

한 번에 끝내는 Java/Spring 웹 개발 마스터

  • Inner Class

1) 지역 내부 클래스

package ch01;

class Outer2 {
	
	int outNum = 100;
	static int sNum = 200;
	
	Runnable getRunnable(int i) { //클래스를 Thread화는 인터페이스 // 스택메모리에 저장됨.
		
		int num = 400;
		
		class MyRunnable implements Runnable { //지역클래스

			int localNum = 500;
			
			@Override
			public void run() {
				
				// i = 50;
				// num = 20;
				// 오류가 나는 이유는, 메소드 호출과 생성 시점이 다르기 때문이다.
				//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 = " + Outer2.sNum + " (외부 클래스 정적 변수)");
			}		
		}
		return new MyRunnable();
	}
}

public class AnonumousInnerTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Outer2 out = new Outer2();
		Runnable runner = out.getRunnable(100);
		
		runner.run(); //호출을 위해서 스택에 잡지 말고 상수 메모리에 따로 저장해야 함.
	}

}

  • 메서드의 호출이 끝나면 메서드에 사용된 지역변수의 유효성은 사라지게 된다.

  • 메소드 호출 이후에도 사용해야 하는 경우가 존재할 때를 대비해서, 지역 내부 클래스에서는 메소드의 지역 변수나 매개 변수를 final로 선언한다고 한다.


2) 익명 내부 클래스

Runnable getRunnable(int i) { //클래스를 Thread화는 인터페이스 // 스택메모리에 저장됨.
		
		int num = 400;
		
		return new Runnable() { //지역클래스

			int localNum = 500;
			
			@Override
			public void run() {
				
				// i = 50;
				// num = 20;
				// 오류가 나는 이유는, 메소드 호출과 생성 시점이 다르기 때문이다.
				//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 = " + Outer2.sNum + " (외부 클래스 정적 변수)");
			}		
		};
	}
	
	Runnable runnable = new Runnable() {
		
		@Override
		public void run() {

			System.out.println("Runnable class");
		}
	};

  • 이름이 없는 클래스로, 클래스의 이름을 생략하고 인터페이스나 추상 클래스로 구현하는 방식이다.
  • 안드로이드 스튜디오에서, widget을 만들때 사용되고는 한다.
  • 이해하는 것이 중요함!!! (하지만 저도 확실하게 이해하고 넘어가는 것은 아니라서 계속 복습할 예정,,,)
profile
혼자서 코딩 공부하는 전공생 초보 백엔드 개발자 / https://github.com/leejinseok0614

0개의 댓글