Nested classes

hoon·2025년 1월 21일

JAVA

목록 보기
12/21

1. 내부 클래스란?

  • 내부 클래스란 클래스 내부에 정의된 클래스를 의미합니다.
  • 외부 클래스와 밀접한 관계가 있는 클래스를 외부 클래스 내부에 정의하여, 캡슐화코드 가독성을 높이는 데 사용됩니다.

2. 내부 클래스의 종류

종류특징
1. 인스턴스 내부 클래스외부 클래스의 인스턴스가 있어야 생성 및 사용 가능.
2. 정적 내부 클래스외부 클래스의 인스턴스 없이 생성 및 사용 가능. static 키워드로 선언.
3. 지역 내부 클래스메서드 내부에 정의되며, 메서드 실행 시에만 사용 가능.
4. 익명 내부 클래스클래스 이름 없이 선언과 동시에 인스턴스를 생성. 인터페이스나 추상 클래스의 구현체를 즉석에서 정의할 때 주로 사용.

3. 내부 클래스의 종류별 예제

1) 인스턴스 내부 클래스

  • 외부 클래스의 인스턴스가 있어야 사용 가능.
public class OuterClass {
    private String outerField = "외부 클래스 필드";

    // 인스턴스 내부 클래스
    public class InnerClass {
        public void display() {
            System.out.println("외부 필드: " + outerField);
        }
    }
}

// 사용 예
public class Main {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass(); // 외부 클래스의 인스턴스를 통해 내부 클래스 생성
        inner.display();
    }
}

2) 정적 내부 클래스

  • 외부 클래스의 인스턴스 없이도 사용 가능.
public class OuterClass {
    private static String staticField = "정적 외부 필드";

    // 정적 내부 클래스
    public static class StaticInnerClass {
        public void display() {
            System.out.println("정적 필드: " + staticField);
        }
    }
}

// 사용 예
public class Main {
    public static void main(String[] args) {
        OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass(); // 외부 클래스의 인스턴스 없이 생성 가능
        inner.display();
    }
}

3) 지역 내부 클래스

  • 메서드 내부에 정의되며, 메서드 실행 동안만 사용 가능.
public class OuterClass {
    public void methodWithLocalClass() {
        class LocalInnerClass { // 지역 내부 클래스
            public void display() {
                System.out.println("지역 내부 클래스입니다.");
            }
        }

        LocalInnerClass localInner = new LocalInnerClass();
        localInner.display();
    }
}

// 사용 예
public class Main {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.methodWithLocalClass();
    }
}

4) 익명 내부 클래스

  • 클래스 이름 없이 선언과 동시에 객체 생성.
  • 주로 인터페이스나 추상 클래스의 구현체를 즉석에서 정의할 때 사용.
public interface MyInterface {
    void execute();
}

public class Main {
    public static void main(String[] args) {
        // 익명 내부 클래스
        MyInterface instance = new MyInterface() {
            @Override
            public void execute() {
                System.out.println("익명 내부 클래스에서 실행합니다.");
            }
        };

        instance.execute();
    }
}

4. 내부 클래스의 장점

  1. 캡슐화 강화
    • 내부 클래스는 외부 클래스와 밀접한 관계를 가지며, 외부 클래스에만 사용되는 부가적인 기능을 포함시킬 수 있습니다.
  2. 가독성 향상
    • 관련성이 높은 클래스를 외부 클래스 내부에 정의하여, 논리적인 그룹화를 통해 코드를 더 이해하기 쉽게 만듭니다.
  3. 외부 클래스와의 밀접한 접근 가능
    • 내부 클래스는 외부 클래스의 private 멤버에도 접근할 수 있습니다.
  4. 코드 간소화
    • 익명 내부 클래스는 별도의 클래스를 정의하지 않고, 즉석에서 필요한 로직을 정의할 수 있습니다.

5. 내부 클래스 사용 시 주의점

  1. 메모리 누수
    • 인스턴스 내부 클래스가 외부 클래스의 인스턴스를 참조하기 때문에, 메모리 누수가 발생할 가능성이 있습니다.
  2. 가독성 저하
    • 내부 클래스의 남용은 코드의 복잡도를 높여 가독성을 떨어뜨릴 수 있습니다.
  3. 지역 내부 클래스와 익명 내부 클래스
    • final 또는 사실상 final 변수만 사용할 수 있습니다. (Java 8 이후부터는 "사실상 final"도 허용)

6. 정리

내부 클래스 종류특징사용 예
인스턴스 내부 클래스외부 클래스의 인스턴스를 통해 생성 및 사용 가능.외부 클래스와 강하게 연관된 부가 기능을 정의할 때.
정적 내부 클래스외부 클래스의 인스턴스 없이 생성 및 사용 가능. static 키워드로 선언.외부 클래스와 독립적으로 동작할 수 있는 기능을 정의할 때.
지역 내부 클래스메서드 내부에 정의되며, 메서드 실행 중에만 사용 가능.특정 메서드에서만 필요한 클래스를 정의할 때.
익명 내부 클래스클래스 이름 없이 선언과 동시에 객체 생성. 주로 인터페이스나 추상 클래스 구현체로 사용.이벤트 리스너와 같은 단발성 구현체가 필요할 때.

내부 클래스는 캡슐화, 가독성, 논리적 그룹화를 위해 효과적으로 사용할 수 있지만, 과도한 사용은 오히려 코드의 복잡성을 증가시킬 수 있으므로 필요한 경우에만 적절히 사용하는 것이 좋습니다.

0개의 댓글