Java - 중첩 클래스와 중첩 인터페이스

<이것이 자바다>를 읽으며 정리

Posted by Yan on May 18, 2021

중첩 클래스 Nested Class

  • 클래스 내부에 선언한 클래스
  • 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다.
  • 외부에는 불필요한 관계 클래스를 감춰서 코드의 복잡성을 줄일 수 있다.
1
2
3
4
5
class ClassName {
    class NestedClassName {
        // 중첩 클래스
    }
}

클래스 내부에 선언되는 위치에 따라서 두가지로 분류

  1. 멤버 클래스 : 클래스 멤버로서 선언되는 중첩 클래스
    • 클래스나 객체가 사용중이라면 언제든지 재사용이 가능
    • 멤버 클래스도 하나의 클래스 -> 컴파일하면 바이트코드 파일(.class) 별도 생성
    • 파일의 이름은 A $ B .class (A: 바깥 클래스, B : 멤버클래스)
      1. 인스턴스 멤버 클래스
        1
        2
        3
        4
        5
        
        classA {
          classB {
           ...
          }
        }
        
      2. 정적 멤버 클래스
        1
        2
        3
        4
        5
        
        classA {
          static classB {
           ...
          }
        }
        
  2. 로컬 클래스 : 메소드 내부에서 선언되는 중첩 클래스
    • 메소드 실행시에만 사용되고, 메소드가 실행 종료되면 없어진다.
    • 로컬 클래스도 하나의 클래스 -> 컴파일하면 바이트코드 파일(.class) 별도 생성
    • 파일의 이름은 A $1 B .class (A: 바깥 클래스, B : 로컬클래스)
      1
      2
      3
      4
      5
      6
      7
      
      classA {
        void method() {
            class B {
                ...
            }
        }
      }
      

인스턴스 멤버 클래스

  • static 키워드 없이 선언된 클래스
    1
    2
    3
    4
    5
    6
    7
    
    class A {
        class B {
            B() { } // 생성자
            int field1; //인스턴스 필드
            void method1() { }; // 인스턴스 메소드
        }
    }
    
  • 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
    • 중첩 클래스 안에 static변수나 static 메소드를 만들 수 없다는 뜻.
  • A클래스 외부에서 인스턴스 멤버 클래스 B의 객체를 생성하려면
    • 먼저 A 객체를 생성한 후
    • B 객체를 생성해야 한다.
      1
      2
      3
      4
      
      A a = new A();
      A.B b = a.new B();
      b.field1 = 3; // 변수에 값을 할당함
      b.method1(); // 메소드를 호출함
      

정적 멤버 클래스

  • static 키워드로 선언된 클래스
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    class A {
        static class C {
            C() { } // 생성자
            static int field1; //인스턴스 필드
            static void method1() { }; // 인스턴스 메소드
            int field2; //인스턴스 필드
            void method2() { } // 인스턴스 메소드
        }
    }
    
  • 모든 종류의 필드와 메소드 선언 가능
  • A클래스 외부에서 정적 멤버 클래스를 생성하기 위해서 A객체를 생성할 필요는 없다.
    1
    2
    3
    4
    5
    
    A.C c = new A.C();
    c.field1 = 3; // 인스턴스 변수에 값을 할당함
    c.method1(); // 인스턴스 메소드를 호출함
    A.C.field2 = 3; // 정적 필드 사용
    A.C.method2();  // 정적 메소드 호출
    

로컬 클래스

  • 메소드 내에서도 선언할 수 있는 것을 local class라 한다.
  • public, private, static을 붙일 수 없다. (메소드와 인스턴스 필드도)
  • 로컬 클래스는 메소드 내부에서만 사용되기 때문에 접근을 제한할 필요가 없기 때문이다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    void method() {
        // 아래부터 로컬 클래스
        class D {
            D() { } // 생성자
            int field1; // 인스턴스 필드
            void method; //
        }
        D d = new D();
        d.field1 = 3;
        d.method1();
    }
    
  • 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.
  • 주로 비동기 처리를 위해 스레드 객체를 만들 때 사용한다.
    1
    2
    3
    4
    5
    
    void method() {
        class DownloadThread extends Thread { ... }
        DownloadThread thread = new DownloadThread();
        thread.start();
    }
    

중첩 인터페이스

1
2
3
4
5
class ClassName {
    interface NestedInterfaceName {
        // 중첩 인터페이스
    }
}
  • 주로 UI프로그래밍에서 이벤트를 처리할 목적으로 많이 활용됨