[자바]중첩 클래스

cloudbread·2025년 10월 14일

1. 중첩 클래스란?

  • 클래스 안에 선언된 클래스
class A {
    class B {
    }
}
  • 감싸는 클래스 = 외부 클래스 = Outer class
  • 중첩 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있음 => 코드의 복잡성 줄어듬 ( 캡슐화 )

2. 중첩 클래스의 종류와 특징

class Outer {
    private static String s = "S";
    private String i = "I";

    static class SNest {
        void print() {
            System.out.println(s);      // OK: static 멤버 접근[web:7]
            // System.out.println(i);   // 컴파일 에러: 인스턴스 멤버 직접 접근 불가[web:4]
        }
    }

    class Inner {
        void print() {
            System.out.println(s);      // OK: static 멤버 접근[web:7]
            System.out.println(i);      // OK: 외부 인스턴스 멤버 접근[web:7]
        }
    }
}

class Main {
    public static void main(String[] args) {
        // static nested class: 외부 인스턴스 없이 생성
        Outer.SNest a = new Outer.SNest();
        a.print(); // "S" 출력[web:7]

        // inner class: 외부 인스턴스 필요
        Outer outer = new Outer();
        Outer.Inner b = outer.new Inner();
        b.print(); // "S", "I" 출력[web:7]
    }
}
  • Static nested class

    • 클래스 정의 내부에 새로운 클래스를 static으로 중첩하여 정의
    • 별도의 클래스이되 Outer 클래스에 의해 소속이 지정된 것으로 생각
    • 상하의 개념이 명확함. (객체가 생성되는 것이 없음)
    • outerclass 객체가 없어도 내부 클래스의 객체를 생성할 수 있음.
  • Non- static nested class (Inner class)

    • 클래스 정의 내부에 새로운 클래스를 static 없이 중첩하여 정의
    • Outer 클래스의 객체가 생성되어야 inner class 객체도 생성할 수 있다.
    • Outer 클래스와 내부 클래스는 밀접한 관계임
    • 전통적으로 static 멤버를 가질 수 없다.
  • Local class

    • 코드 블락 내부에서 지역적으로 정의한 클래스 => 외부에서는 이 클래스에 접근 할 수 없다
    • 외부 클래스의 모든 멤버를 접근 가능
    • 자신이 포함된 메서드의 지역 변수 접근 가능 (실질적으로 final, 즉 값이 변경되지 않는 지역 변수만 접근 가능)
    • static 멤버를 가질 수 없음
  • Anonymous inner class

    • 이름 없는 일회용 클래스
    • 이름이 없어서 그냥 $1, $2 ... 이런 식으로 파일이 생성될 것임.
    • 특정 클래스 또는 인터페이스의 객체를 생성하면서, 이 클래스 또는 인터페이스의 메서드를 재정의 또는 구현하는 코드를 바로 작성함으로써 자손 타입을 만들고 객체도 생성함.

3. 교수님 정리

  • Scanner$FindSpliterator.class => innerclass임, class 파일이 2개인것임.
  • 도그라는 이름을 가진 animal 객체만 override된 makeSound 메서드를 사용하는지. 이것도 오버라이드 된 것이 때문에 동적 바인딩인지
profile
잡다한거 다 공부중....

0개의 댓글