컴퓨터 & 코딩/Java

[혼공학습단 10기][혼공자] 중첩 클래스 / 중첩 인터페이스 / 익명 객체

구로그 2023. 7. 10. 19:42
728x90

✓ 중첩 클래스

- 클래스 내부에 선언한 클래스. 

- 바이트코드 파일명: 멤버 클래스 - 바깥클래스$멤버클래스.class, 로컬 클래스 - 바깥클래스$1로컬클래스.class 

 

1. 멤버 클래스 

- 클래스의 멤버로서 선언.

- 클래스나 객체가 사용 중이라면 언제든지 재사용이 가능하다 

 

1) 인스턴스 멤버 클래스: static 키워드 없이 중첩 선언된 클래스. 인스턴스 필드, 메소드만 선언 가능하고 정적 필드와 메소드는 선언 할 수 없다. 바깥 클래스 객체를 생성해야만 사용할 수 있다.

class A {
    class B { // 인스턴스 멤버 클래스 
        B() {} // 생성자
        int fiels1; // 인스턴스 필드
        void method1() {} // 인스턴스 메소드
    }
}
// 사용시
A a = new A();
A.B b = a.new B();

2) 정적 멤버 클래스: 바깥 클래스로 바로 접근할 수 있다. 

class A {
    static class C {  // 정적 멤버 클래스
        C() {}  // 생성자
        int field1;  // 인스턴스 필드
        static int field2;  // 정적 필드
        void method1() {}  // 인스턴스 메소드
        static void method2() {}  // 정적 메소드
    }
}
// 사용시
A.C c = new A.C();

 

 

2. 로컬 클래스

- 생성자 또는 메소드 내부에서 선언. (접근 제한자, static 붙일 수 없음)

- 메소드를 실행할 때만 사용되고 메소드가 종료되면 없어진다.

- 인스턴스 필드와 메소드만 선언 가능하고 정적 필드와 메소드는 선언할 수 없다.

- 매개 변수와 로컬 변수가 final 특성을 갖게 됨 

void method() {
    class D {  // 로컬 클래스
        D() { }  //생성자
        int field1;  // 인스턴스 필드
        void method1() {}  // 인스턴스 메소드
    }
    // 사용시
    D d = new D();
    d.field1 = 3;
    d.method1();
}

 

✓ 중첩 인터페이스

- 클래스 내부에 선언된 인터페이스.

- 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 사용가능.

- 주로 UI 프로그래밍에서 이벤트를 처리할 목적으로 정적 멤버 인터페이스를 많이 사용한다. 

 


✓ 익명객체

- 이름이 없는 객체 

- 반드시 어떤 클래스를 상속하거나 인터페이스를 구현해야만 한다 

부모클래스 [필드|변수] = new 부모클래스(매개값, ...) {
    // 필드와 메소드
};  // 하나의 실행문이기 때문에 세미콜론을 반드시 붙여야 함

- 익명 자식 객체에 새롭게 정의된 필드와 메소드는 익명 자식 객체 내부에서만 사용되고 외부에서는 접근이 불가하다. 

(익명 자식 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만 사용할 수 있기 때문이다)

 

- 익명 구현 객체 생성 (매개 변수와 로컬 변수가 final 특성을 갖게 된다)

인터페이스 [필드|변수] = new 인터페이스() {
    // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
    // 필드와 메소드
}

 

반응형