오답노트

[Java] 지역 내부 클래스와 익명 내부 클래스 본문

Java

[Java] 지역 내부 클래스와 익명 내부 클래스

권멋져 2023. 7. 10. 09:51

지역 내부 클래스

말 그래도 클래스 안에 있는 클래스를 의미한다.

주의 해야할 점은 지역 내부 클래스는 스택 메모리에 잡히게 된다. 이때 지역 내부 클래스가 쓰레드 같은 경우에 지역 내부 클래스의 멤버 변수를 변경하려고 하면 에러가 발생한다.

그 이유는 스택 메모리에 생성된 변수가 사라지기 때문이다.

그래서 메서드 호출 이후에도 사용해야하는 경우가 있을 수 있으므로 지역 내부 클래스에서 사용하는 매서드의 지역 변수나 매개 변수는 final로 선언된다.

 

class Outer2{
	
	int outNum = 100;
	static int sNum = 200;
	
	Runnable getRunnalbe(int i) {
		int Num = 10;
		
		class myRunnalbe implements Runnable {
			
			int localNum = 1000;
			@Override
			public void run() {
				
				i = 50; // 지역 변수 변경으로 오류 발생
				Num = 20; // 지역 변수 변경으로 오류 발생
				
				System.out.println("i : " +  i);
				System.out.println("Num : " +  Num);
				System.out.println("outNum : " +  outNum);
				System.out.println("sNum : " +  sNum);
				System.out.println("localNum : " +  localNum);
				
			}
			
		}
		
		return new myRunnalbe();
	}
}

 

익명 내부 클래스

말 그대로 이름이 없는 클래스로 클래스의 이름을 생략하고 주로 하나의 인터페이스나 하나의 추상 클래스를 구현하여 반환한다.

인터페이스나 추상 클래스 자료형의 변수에 직접 대입하여 클래스를 생성하거나 지역 내부 클래스의 메서드 내부에서 생성하여 반환 가능.

 

class Outer2{
	
	int outNum = 100;
	static int sNum = 200;
	
	Runnable getRunnalbe(int i) {
		int Num = 10;
		
		return new Runnable() {
			
			int localNum = 1000;
			@Override
			public void run() {
				
				
				System.out.println("i : " +  i);
				System.out.println("Num : " +  Num);
				System.out.println("outNum : " +  outNum);
				System.out.println("sNum : " +  sNum);
				System.out.println("localNum : " +  localNum);
				
			}
			
		};
			
	}
	
	Runnable runnable = new Runnable() {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			
		}
		
	};
	
}

'Java' 카테고리의 다른 글

[Java] 스트림  (0) 2023.07.10
[Java] 람다식  (0) 2023.07.10
[Java] 추상화  (0) 2023.07.08
[Java] 인터페이스  (0) 2023.07.08
[Java] 유형에 따른 사용 메모리 정리  (0) 2023.07.08