본문 바로가기
Java

자바 - 내부 클래스(Inner class)

by 작은돼지 2022. 8. 10.
1. 내부 클래스의 정의
  • 클래스 내에 선언된 클래스
  • 외부 클래스와 밀접한 연관이 있을 때 사용
  • 내부 클래스에서 외부 클래스의 멤버에게 접근할 수 있음
// 외부 클래스
class Outer {

	// 내부 클래스
	class Inner {
    
    	}
}

 

2. 선언 위치에 따른 내부 클래스의 종류

변수 선언과 동일하게 인스턴스, 클래스, 메서드 레벨을 따름

class Outer {
	int instanceVariable; // 인스턴스 변수
	static int staticVariable; // 정적 변수

	void method() {
		int localVariable; // 지역 변수
	}

}
class Outer {
	class InstanceInner {
		// ...
	}

	static class StaticInner {
		// ...
	}

	public void method() {
    
		class LocalInner {
			// ...
		}
	}

}

 

복습

인스턴스 변수(멤버 변수)

인스턴스가 생성될 때 마다 개별적인 복사본이 생성

각각의 인스턴스마다 고유한 값을 가짐 (인스턴스 레벨)

 

정적 변수(멤버 변수)

클래스의 모든 인스턴스들이 공유하는 값 (클래스 레벨)

 

지역 변수

선언된 블록 내에서만 사용 가능 (메서드 레벨)

 

매개 변수

메서드 또는 생성자의 선언부에 정의되는 변수

메서드가 호출될 때 전달되는 값에 대한 참조

지역 변수로 취급

참고 사항: call by value, call by reference

 

3. 내부 클래스의 사용
class Outer {
	private int outerInstanceVariable;
	static int outerStaticVariable;

	class InstanceInner {
		int a = outerInstanceVariable; // 외부 private 필드 접근 가능
		int b = outerStaticVariable;
	}

	static class StaticInner {
	//	int x = outerInstanceVariable; // static 클래스는 외부 클래스의 인스턴스 멤버 접근 불가
		int y = outerStaticVariable;
	}

	public void method() {
		int localVariable = 0;
		
		class LocalInner {
			int i = localVariable;
		}
	}

}

 

class Outer {

	class InstanceInner {
		int iv = 1;
	}

	static class StaticInner {
		int iv = 2;
		static int cv = 3;
	}

	public void method() {
		int localVariable = 4;

		class LocalInner {
			int lv = localVariable;
		}
	}

	public static void main(String[] args) {

		System.out.println(Outer.StaticInner.cv);

		Outer outer = new Outer();
		Outer.InstanceInner instanceInner = outer.new InstanceInner();
		System.out.println(instanceInner.iv);

		Outer.StaticInner staticInner = new StaticInner();
		System.out.println(staticInner.iv);

	}

}