내부 클래스란?
클래스 내에 선언된 클래스다. 클래스에 다른 클래스를 선언하는 이유는 두 클래스가 밀접하게 연관되어 있기 때문이다. 내부 클래스는 외부 클래스의 멤버로 간주되며, 외부 클래스 멤버에 접근할 수 있다. 아래와 같은 형태로 선언될 수 있다.
class OuterClass {
// 외부 클래스 멤버
class InnerClass {
// 내부 클래스 멤버
}
}
내부 클래스를 사용하는 이유
내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있다. → 코드의 복잡성을 줄일 수 있다.
서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 캡슐화를 증가시키고, 코드의 복잡성을 낮출 수 있다.
외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 보안성을 높일 수 있다.
내부 클래스의 종류
1. 인스턴스 내부 클래스(Instance Inner Class)
외부 클래스의 인스턴스가 생성된 후에만 내부 클래스의 인스턴스를 생성할 수 있다. 인스턴스 내부 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 있다.
class OuterClass {
private int x;
class InnerClass {
public void display() {
System.out.println(x); // 외부 클래스의 인스턴스 멤버에 접근
}
}
}
2. 정적 내부 클래스(Static Inner Class)
내부 클래스가 static 으로 선언되면, 외부 클래스의 인스턴스 없이도 내부 클래스의 인스턴스를 생성할 수 있다. 정적 내부 클래스는 외부 클래스의 정적 멤버에만 접근할 수 있다.
class OuterClass {
private static int x;
static class InnerClass {
public void display() {
System.out.println(x); // 외부 클래스의 정적 멤버에 접근
}
}
}
3. 지역 내부 클래스(Local Inner Class)
메서드나 초기화 블록 내에 정의되는 내부 클래스이다. 지역 내부 클래스는 해당 블록 내에서만 유효하며, 외부 클래스의 멤버에 접근할 수 있다.
class OuterClass {
public void outerMethod() {
int x = 10;
class InnerClass {
public void display() {
System.out.println(x); // 외부 클래스의 지역 변수에 접근
}
}
}
}
4. 익명 내부 클래스(Anonymous Inner Class)
이름이 없는 내부 클래스로, 주로 인터페이스의 구현이나 추상 클래스의 확장을 위해 사용된다. 익명 내부 클래스는 클래스 정의와 동시에 인스턴스를 생성한다.
interface MyInterface {
void display();
}
class OuterClass {
public void outerMethod() {
MyInterface innerClass = new MyInterface() {
public void display() {
System.out.println("Anonymous Inner Class");
}
};
innerClass.display();
}
}