내부 클래스와 익명 클래스는 무엇이고 어떻게 사용할까?
내부 클래스 (Inner Class)
--
내부 클래스는
클래스 내부에 선언된 클래스를 의미한다.
내부 클래스를 감싸고 있는 (겉에 있는) 클래스를 "외부 클래스"라고 부른다.
내부 클래스 종류
- 인스턴스 내부 클래스
- static 내부 클래스
- 지역 내부 클래스
- 익명 내부 클래스
인스턴스 내부 클래스는
외부 클래스의 인스턴스에 종속되는 클래스로
외부 클래스의 멤버(필드) 중 하나라고 생각하면 된다.
class OuterClass { private String message = "Hello from OuterClass"; // 인스턴스 내부 클래스 class InnerClass { public void displayMessage() { System.out.println(message); // 외부 클래스의 멤버에 접근 가능 } } } public class Main { public static void main(String[] args) { OuterClass outer = new OuterClass(); // 외부 클래스 객체 생성 OuterClass.InnerClass inner = outer.new InnerClass(); // 내부 클래스 객체 생성 inner.displayMessage(); // "Hello from OuterClass" } }
Static 내부 클래스는
외부 클래스의 Static 멤버와 동일하게 다뤄지며,
외부 클래스의 객체와 독립적으로 동작할 수 있는 클래스다.
class OuterClass { private static String message = "Hello from OuterClass"; // 정적 내부 클래스 static class InnerClass { public void displayMessage() { System.out.println(message); // 외부 클래스의 Static 멤버에 접근 가능 } } } public class Main { public static void main(String[] args) { OuterClass.InnerClass inner = new OuterClass.InnerClass(); // 외부 클래스 인스턴스 없이 생성 가능 inner.displayMessage(); // "Hello from OuterClass" } }
지역 내부 클래스는
외부 클래스에 존재하는 메서드나 초기화블록 내부에 작성된 클래스로,
해당 메서드나 블록 내에서만 유효하며, 메서드나 블록이 종료되면 지역 클래스의 객체는 사라진다.
class OuterClass { // 멤버 메서드 public void createInnerClass() { // 지역 내부 클래스 class LocalInnerClass { public void display() { System.out.println("Hello from LocalInnerClass"); } } LocalInnerClass localInner = new LocalInnerClass(); localInner.display(); // "Hello from LocalInnerClass" } } public class Main { public static void main(String[] args) { OuterClass outer = new OuterClass(); outer.createInnerClass(); } }
익명 내부 클래스는
이름이 없는 클래스로,
클래스의 선언과 객체의 생성을 동시에 하는 이름 없는 클래스다.
해당 클래스는 다른 클래스와 달리 정의하여 재활용하는 것이 아니라
바로 클래스를 정의하자 마자 객체로 생성하여 사용하므로 일회용 클래스다.
class OuterClass { public void createAnonymousClass() { // 익명 내부 클래스 Runnable runnable = new Runnable() { // 익명 클래스 내용 작성 @Override public void run() { System.out.println("Hello from Anonymous Inner Class"); } }; runnable.run(); } } public class Main { public static void main(String[] args) { OuterClass outer = new OuterClass(); outer.createAnonymousClass(); } }
정리
class Outer {
class InstanceInner { // 인스턴스 클래스
...
}
static class StaticInner { //static클래스
...
}
void myMethod() {
class LocalInner { //지역 클래스
...
}
}
Object test = new Object(){ // 익명 클래스
...
}
}
내부 클래스도 클래스이므로
클래스에 작성하는 접근 제어자나 기타 제어자들을 사용할 수 있다.
--
익명 클래스 (Anonymous Class)
--
익명 클래스는
클래스의 선언과객체의 생성을 동시에 하는 클래스로
단 한번만 사용가능한 일회용 클래스다.
클래스를 상속하거나 인터페이스를 구현해야만 익명 클래스를 사용할 수 있다.
익명 클래스 기본 형식
new 부모클래스이름() {
...
}
new 구현인터페이스이름() {
...
}
// 기존 클래스 사용
class Name {
...
}
Name n = new Name();
// 익명 클래스 사용
Object op = new Object() { ... }
Interface III {
void sayHello();
}
III i = new III() {
@Override
public void sayHello() {
System.out.println("Hello from Anonymous Class");
}
}
익명 클래스는
이름이 없는 클래스로 부모클래스나 상위 인터페이스의 이름을 빌려 작성한다.
그리고 생성된 익명 클래스의 파일명은 $1.class 파일로 정의된다.
--
'Language > Java' 카테고리의 다른 글
java.lang 패키지 (1) | 2024.10.29 |
---|---|
예외처리 (try-catch, finally, throw) (0) | 2024.10.24 |
인터페이스 (1) | 2024.10.22 |
다형성 (예시 : A opt = new B()) (0) | 2024.10.21 |
제어자, 접근 제어자 (+ static, final, abstract, 추상 클래스, 추상 메서드) (0) | 2024.10.20 |