내부 클래스(Inner Class)
- 내부 클래스(Inner Class)는 클래스 내부에 선언된 클래스로, 다양한 형태와 용도로 사용된다.
- 내부 클래스는 주로 외부 클래스의 멤버에 대한 접근을 용이하게 하고, 코드의 논리적 그룹화를 도와 코드를 더 읽기 쉽고 관리하기 쉽게 만든다.
내부 클래스 특징
- 내부 클래스에서 외부 클래스 멤버에 접근 가능
- 외부에서는 내부 클래스에 접근 불가
내부 클래스 종류
- 인스턴스 클래스(instance class)
외부 클래스의 인스턴스와 연결된 클래스
외부 클래스의 인스턴스 메서드와 멤버 변수에 접근할 수 있다.
class Outer {
private String outerField = "Outer field";
class Inner {
void display() {
System.out.println(outerField); // 외부 클래스의 필드에 접근
}
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display(); // "Outer field" 출력
}
}
- 정적 클래스(static class)
외부 클래스의 정적 멤버로 취급되는 클래스
외부 클래스의 인스턴스 멤버에 접근할 수 없지만, 정적 멤버에는 접근 가능
class Outer {
private static String staticField = "Static field";
static class StaticInner {
void display() {
System.out.println(staticField); // 외부 클래스의 정적 필드에 접근
}
}
}
public class Test {
public static void main(String[] args) {
Outer.StaticInner staticInner = new Outer.StaticInner();
staticInner.display(); // "Static field" 출력
}
}
- 지역 클래스(local class)
특정 블록 내에서만 사용되는 클래스
주로 메서드 내에 선언되며, 선언된 메서드 내에서만 사용된다.
class Outer {
void someMethod() {
class LocalInner {
void display() {
System.out.println("Inside LocalInner");
}
}
LocalInner localInner = new LocalInner();
localInner.display(); // "Inside LocalInner" 출력
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.someMethod();
}
}
- 익명 클래스(anonymous class)
이름이 없는 일회용 클래스
주로 인터페이스나 간단한 클래스의 확장으로 사용된다.
interface Greet {
void sayHello();
}
public class Test {
public static void main(String[] args) {
Greet greet = new Greet() {
public void sayHello() {
System.out.println("Hello, World!");
}
};
greet.sayHello(); // "Hello, World!" 출력
}
}
익명 클래스
- 이름을 가지지 않는 클래스
- 선언과 동시에 객체 생성
- 일회용 클래스
이러한 내부 클래스들은 각각 다른 상황과 요구 사항에 따라 적절하게 사용된다. 인스턴스 클래스와 정적 클래스는 외부 클래스와의 밀접한 관련성 때문에 사용되며, 지역 클래스와 익명 클래스는 주로 일회성이거나 특정 스코프에서만 사용되는 경우에 유용하다.