블로그

[JAVA] 중첩 클래스, 익명 클래스 본문

개발자 준비과정/JAVA

[JAVA] 중첩 클래스, 익명 클래스

하늘바람a 2024. 3. 12. 16:51
선언 위치에 따른 분류선언 위치객체 생성 조건
멤버 클래스인스턴스 멤버 클래스class A {
class B { ... }}
A 객체를 생성해야만
B 객체를 생성할 수 있음
정적 멤버 클래스class A {
static class B { ··· }}
A 객체를 생성하지 않아도
B 객체를 생성할 수 있음
로컬 클래스class A {
void method() {
class B { · · · }}
method가 실행할 때만
B 객체를 생성할 수 있음

 
멤버 클래스 : 클래스의 멤버로서 선언되는 중첩 클래스
로컬 클래스 : 메소드 내부에서 선언되는 중첩 클래스
 

인스턴스 멤버 클래스

 

  • B 객체는 A 클래스 내부 어디에서나 생성할 수는 없고, 인스턴스 필드값, 생성자, 인스턴스 메소드에서 생성할 수 있다. 
  • A 객체가 있어야 B 객체도 생성할 수 있기 때문이다.

 
 

정적 멤버 클래스
  • 정적 멤버 클래스 B는 A 클래스 내부에서 사용되기도 하지만, 
  • A 클래스 외부에서 A와 함께 사용되는 경우가 많기 때문에 주로 default 또는 public 접근 제한을 가진다. 
  • B 객체는 A 클래스 내부 어디든 객체를 생성할 수 있다.

 

로컬 클래스

 

  • 로컬 클래스는 생성자와 메소드가 실행될 동안에만 객체를 생성할 수 있다.
  • 로컬 클래스 B 내부에는 일반 클래스와 같이 필드, 생성자, 메소드 선언이 올 수 있다.
  • (정적 필드, 정적 메소드는 Java 17부터 선언 가능)
  •  
  • 로컬 변수(생성자 또는 메소드의 매개변수 또는 내부에서 선언된 변수)를 로컬 클래스에서 사용할
  • 경우 로컬 변수는 final 특성을 갖게 되므로 값을 읽을 수만 있고 수정할 수 없게 된다. 
  • 그 이유는 로컬 클래스 내부에서 값을 변경하지 못하도록 제한하기 때문이다.
  • Java 8 이후부터는 명시적으로 final 키워드를 붙이지 않아도 된다

 

중첩 인터페이스

중첩 인터페이스

 

  • 중첩 인터페이스는 클래스의 멤버로 선언된 인터페이스를 말한다. 
  • 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 객체를 만들기 위해서이다. 
  • 중첩 인터페이스는 안드로이드와 같은 UI 프로그램에서 이벤트를 처리할 목적으로 많이 활용된다.
  • 예를 들어 버튼을 클릭했을 때 이벤트를 처리할 객체는 중첩 인터페이스를 구현해서 만든다.

 

익명 클래스(Anonymous class)

말 그대로 이름이 없는 클래스이다.
익명 클래스는 인스턴스 생성과 상속을 한번에 처리한다.

public class C01AnonymousClass {
    public static void main(String[] args) {
//        C01MyClass obj = new C01MyClass(); // 불가능
//        C01MyClass obj = new C01Child();   // 불가능
        // 추상클래스는 객체를 만들지 못한다
        
        // 익명클래스의 객체
        C01Parent obj = new C01Parent(){};
        // 클래스와 인스턴스를 동시에 만든다.
    }
}

abstract class C01Parent {}
//class C01Child extends C01MyClass{} //익명클래스에선 상속클래스를 생략한다

 

  • 클래스의 선언과 객체의 생성이 동시에 이루어진다

 
추상클래스 안에 메소드가 있을 경우, 익명클래스에서 재정의(Override)를 꼭 해야 한다.

public class C03AnonymousClass {
    public static void main(String[] args) {
        C03Parent obj = new C03Parent() {
            // 추상메소드 꼭 재정의하기
            @Override
            void method() {
                System.out.println("C03AnonymousClass.method");
            }
        };
        obj.method();
    }
}
abstract class C03Parent {
    abstract void method(); // 메소드 존재
}

 
 
클래스가 아닌 인터페이스로도 가능하다.  이는 람다식으로 표현할 수 있다.

public class C06AnonymousClass {
    C06MyInterface o = new C06MyInterface() {
        @Override
        public void method1() {
            System.out.println("C06AnonymousClass.method1");
        }

        @Override
        public void method2() {
            System.out.println("C06AnonymousClass.method2");
        }
    };
}

interface C06MyInterface {
    void method1(); //추상 메소드
    void method2();
}
public class C08Lamda {
    public static void main(String[] args) {
        C08MyInterface obj = () -> System.out.println("재정의");
        obj.method();
    }
}

// 추상 메소드가 하나인 인터페이스의
// 익명클래스 객체 생성시 람다 표현식으로
// 코드를 간단하게 작성 가능하다
interface C08MyInterface {
    void method(); //추상 메소드가 있으면 위에서 꼭 재정의 해야 함
}



출처 : 이것이 자바다 
 

'개발자 준비과정 > JAVA' 카테고리의 다른 글

[JAVA] Object 클래스, 포장 클래스(Wrapper class)  (1) 2024.03.14
[JAVA] 람다식  (0) 2024.03.13
[JAVA] instanceof 연산자  (0) 2024.03.11
[JAVA] 객체 배열...  (3) 2024.03.07
[JAVA] Class String, Arrays 주요 메소드  (1) 2024.03.06