클래스 내부에 선언되되 메서드 밖에 선언된 클래스를 멤버 내부 클래스(member inner class)라고 합니다.
멤버 내부 클래스는 다음 두 가지 방식으로 인스턴스화할 수 있습니다.
- 클래스 내부에서 호출
- 클래스 외부에서 호출
내부 클래스의 기본 규칙
- 외부 클래스(내부 클래스를 포함하는 클래스)는 자신의 코드 안에서 원하는 만큼 자유롭게 내부 클래스 객체를 생성할 수 있습니다.
- 내부 클래스가
public이고 이를 감싸는 외부 클래스 역시public이라면, 전혀 관련 없는 다른 클래스에서도 해당 내부 클래스의 인스턴스를 생성할 수 있습니다. - 외부 클래스 객체가 생성된다고 해서 내부 클래스 객체가 자동으로 함께 생성되지는 않습니다.
- 내부 클래스가
static으로 선언된 경우에는 외부 클래스 인스턴스 없이도 바로 인스턴스화할 수 있습니다. 반면 일반(비정적) 내부 클래스의 객체는 반드시 외부 클래스 인스턴스와 연결되어야 합니다. - 외부 클래스는 내부 클래스의
private메서드까지도 직접 호출할 수 있습니다.
1. 클래스 내부에서 호출하는 경우
아래 예제에서는 OuterClass의 display() 메서드 안에서 멤버 내부 클래스의 메서드를 호출합니다. 외부 클래스 내부라면 일반적인 객체 생성 문법(new InnerClass())을 그대로 사용할 수 있습니다.
예제 코드
public class OuterClass {
private int value = 20;
class InnerClass {
void show() {
System.out.println("Value is: " + value);
}
}
void display() {
InnerClass ic = new InnerClass();
ic.show();
}
public static void main(String args[]) {
OuterClass oc = new OuterClass();
oc.display();
}
}
실행 결과
Value is: 20
2. 클래스 외부에서 호출하는 경우
아래 예제에서는 OuterClass 외부에 있는 Test 클래스에서 InnerClass의 show() 메서드를 호출합니다. 외부에서 비정적 내부 클래스를 생성하려면 먼저 외부 클래스의 인스턴스를 만든 뒤, obj.new InnerClass() 형태의 특수한 문법을 사용해야 합니다.
예제 코드
class OuterClass {
private int value = 20;
class InnerClass {
void show() {
System.out.println("Value is: " + value);
}
}
}
public class Test {
public static void main(String args[]) {
OuterClass obj = new OuterClass();
OuterClass.InnerClass in = obj.new InnerClass();
in.show();
}
}
실행 결과
Value is: 20