Java의 익명 내부 클래스

Shikha Chaudhary 2023년10월12일
  1. Java의 익명 내부 클래스
  2. Java에서 익명 내부 클래스의 변수 및 멤버
  3. Java에서 익명 내부 클래스 생성
  4. Java의 다양한 유형의 익명 내부 클래스
  5. Java에서 익명 내부 클래스의 장점
  6. 결론
Java의 익명 내부 클래스

이 기사에서는 Java의 Anonymous Inner 클래스와 그 유용성에 대해 설명합니다.

Java의 익명 내부 클래스

익명이라는 단어는 알 수 없는 이름을 의미합니다. Java 익명 내부 클래스의 경우에도 마찬가지입니다.

이름이 없고 단일 객체만 생성하면 되는 내부 클래스를 Java 익명 내부 클래스라고 합니다. 클래스나 인터페이스에서 메서드를 오버로드하는 것과 같은 추가 작업을 수행해야 할 때 개체의 인스턴스를 만들어야 할 때 유용합니다.

클래스의 하위 클래스를 만들지 않고 Java 익명 내부 클래스를 사용하여 이를 수행할 수 있습니다.

즉, 이름이 없는 클래스를 Java 익명 내부 클래스라고 합니다. 일반적으로 새 클래스를 만들 때마다 이름이 있습니다.

따라서 Java 익명 내부 클래스는 새 클래스를 만드는 데 사용되지 않습니다. 오히려 우리는 클래스나 인터페이스의 메서드를 재정의하는 데 사용합니다.

또한 리스너 인터페이스에 대한 구현 클래스를 작성하는 그래픽 프로그래밍에도 유용합니다.

Java 익명 내부 클래스의 구문은 클래스 정의가 코드 블록 내부에도 있다는 점을 제외하고 생성자의 호출과 유사합니다.

통사론:

Demo d = new Demo() {
  public void demo_method() {
    // definition
  }
};

여기서 demo는 추상/구체 클래스 또는 인터페이스를 나타냅니다. 익명 내부 클래스의 개념을 더 잘 이해하기 위해 일반 Java 클래스와 어떻게 다른지 살펴보겠습니다.

  • 일반 클래스를 사용하여 인터페이스를 원하는 수만큼 구현할 수 있지만 익명 내부 클래스는 한 번에 하나의 인터페이스만 구현합니다.
  • 일반 클래스는 다른 클래스를 확장하고 동시에 여러 인터페이스를 구현할 수 있습니다. 반면 익명의 내부 클래스는 한 번에 이러한 작업 중 하나만 수행할 수 있습니다.
  • 생성자의 이름은 클래스의 이름과 동일합니다. 이는 일반 클래스에서 생성자를 얼마든지 작성할 수 있음을 의미하지만 익명의 내부 클래스에서는 그렇지 않습니다.

Java의 내부 클래스에 대한 자세한 내용은 이 문서를 참조하십시오.

Java에서 익명 내부 클래스의 변수 및 멤버

익명 내부 클래스는 Java의 로컬 클래스와 마찬가지로 변수도 캡처합니다. 지역 변수에 대한 액세스는 둘러싸는 클래스와 동일합니다.

둘러싸는 클래스의 멤버는 익명 클래스에서 액세스할 수 있습니다. 그러나 최종적이지 않은 지역 변수(포함하는 범위에 있는 변수도 포함하지 않음)에는 액세스할 수 없습니다.

또한 익명 클래스에서 유형을 선언하면 해당 범위에서 동일한 이름을 가진 다른 선언을 숨깁니다. 익명의 내부 클래스에도 몇 가지 제한 사항이 있습니다.

  • 익명 내부 클래스는 정적 이니셜라이저 또는 멤버 인터페이스의 선언을 허용하지 않습니다.
  • 정적 멤버는 상수 변수인 경우 익명 클래스의 일부가 될 수 있습니다.

익명 클래스 내부에 필드, 추가 메서드, 인스턴스 이니셜라이저 및 로컬 클래스를 선언할 수 있다는 결론을 내립니다.

Java에서 익명 내부 클래스 생성

익명의 내부 클래스를 만드는 데 사용할 수 있는 두 가지 주요 방법이 있습니다. 여기에는 다음이 포함됩니다.

  • A 클래스(추상 또는 구체적)
  • 인터페이스

하나씩 살펴보겠습니다.

클래스를 사용하여 Java에서 익명 내부 클래스 생성

먼저 아래의 예를 보십시오.

abstract class Demo {
  abstract void demo();
}
class AnonymousDemo {
  public static void main(String args[]) {
    Demo d = new Demo() {
      void demo() {
        System.out.println("This is a demo of an anonymous inner class using  class.");
      }
    };
    d.demo();
  }
}

출력:

This is a demo of an anonymous inner class using class.

여기에서 컴파일러에 의해 이름이 결정되는 클래스가 생성됩니다. 이 클래스는 Demo 클래스를 확장하고 demo() 메서드를 구현합니다.

익명 클래스의 객체는 d입니다. 익명 유형 Demo 클래스의 참조 변수입니다. 컴파일을 위해 이것을 AnonymousDemo.java로 저장합니다.

아래 코드는 컴파일러가 내부 클래스를 생성하는 방법입니다.

import java.io.PrintStream;
static class AnonymousDemo$1 extends Demo {
  AnonymousDemo$1() {}
  void demo() {
    System.out.println("This is a demo of an anonymous inner class using class.");
  }
}

인터페이스를 사용하여 Java에서 익명 내부 클래스 생성

위 섹션에서는 클래스를 사용합니다. 그러나 여기서는 익명의 내부 클래스에 대한 인터페이스를 사용합니다. 예를 들어 이것을 이해합시다.

interface Demonstration {
  void demo();
}
class AnonymousDemo {
  public static void main(String args[]) {
    Demonstration d = new Demonstration() {
      public void demo() {
        System.out.println("This is an example of an anonymous inner class using an interface.");
      }
    };
    d.demo();
  }
}

출력:

This is an example of an Anonymous inner class using an interface.

여기에서 컴파일러에 의해 이름이 결정되는 클래스가 생성됩니다. 이 클래스는 Demonstration 인터페이스를 구현하고 demo() 메소드의 구현을 제공합니다.

익명 클래스의 객체는 d입니다. 데모 유형의 참조 변수입니다. 컴파일을 위해 이것을 AnonymousDemo.java로 저장합니다.

아래 코드는 컴파일러가 내부 클래스를 생성하는 방법입니다.

import java.io.PrintStream;
static class AnonymousDemo$1 implements Demonstration {
  AnonymousDemo$1() {}
  void demo() {
    System.out.println("This is an example of an anonymous inner class using an interface.");
  }
}

Java의 다양한 유형의 익명 내부 클래스

익명 내부 클래스는 선언 및 동작에 따라 3가지 유형으로 분류됩니다.

  • 클래스를 확장하는 Anonymous 내부 클래스.
  • 인터페이스를 구현하는 익명의 내부 클래스.
  • Anonymous Inner 클래스는 메소드/생성자 인수 내부에 정의되어 있습니다.

이 세 가지 유형에 대해 하나씩 논의해 보겠습니다.

Java에서 클래스를 확장하는 익명의 내부 클래스

Thread 클래스를 확장하여 스레드를 만들 수 있으며 클래스를 확장하는 익명의 내부 클래스를 가질 수도 있습니다.

여기에서 new 키워드를 사용하여 상위 클래스 유형을 참조하는 객체를 생성합니다. 아래의 예를 보십시오.

class Demo {
  public void example() {
    System.out.println("Types of Anonymous classes");
  }
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Demo d1 = new Demo();
    d1.example();
    Demo d2 = new Demo() {
      @Override
      public void example() {
        System.out.println("Type - 1");
      }
    };
    d2.example();
  }
}

출력:

Types of Anonymous classes
Type - 1

Java에서 인터페이스를 구현하는 익명의 내부 클래스

Runnable 인터페이스를 구현하여 스레드를 생성할 수 있으며 익명의 내부 클래스도 인터페이스를 구현할 수 있습니다. new 키워드를 사용하여 인터페이스 유형을 참조하는 익명의 내부 클래스 객체를 생성합니다.

interface Demo {
  public void demo();
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Demo d = new Demo() {
      @Override
      public void demo() {
        System.out.println("Type - 2");
      }
    };
    d.demo();
    System.out.println(d.getClass().getName());
  }
}

출력:

Type - 2
AnonymousDemo$1

Java의 메소드/생성자 인수 내부의 익명 내부 클래스

메서드 또는 생성자 인수 내부의 익명 내부 클래스는 GUI(그래픽 사용자 인터페이스) 응용 프로그램에서 사용됩니다. 여기서 우리는 익명의 내부 클래스를 인수로 사용하여 메서드나 생성자에 전달합니다.

다음은 예입니다.

abstract class Demo {
  public abstract void demo();
}
class Example {
  public void example(Demo d) {
    d.demo();
  }
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Example e = new Example();
    e.example(new Demo() {
      @Override
      public void demo() {
        System.out.println("Type - 3");
      }
    });
  }
}

출력:

Type - 3

Java에서 익명 내부 클래스의 장점

익명의 내부 클래스는 메서드의 지역 변수에 대해 닫히므로 내부 클래스에 비해 이점이 추가됩니다. 또한 이러한 클래스는 장황함을 줄이고 재사용성을 제공합니다.

또한 이러한 클래스는 개발자가 모든 클래스의 이름을 스스로 찾을 필요가 없기 때문에 도움이 됩니다. 익명의 내부 클래스를 동시에 사용하여 클래스를 선언하고 인스턴스화할 수 있습니다.

전반적으로 익명의 내부 클래스는 Java의 장점 중 하나입니다.

Java의 익명 내부 클래스에 대한 자세한 내용은 이 문서를 참조하십시오.

결론

이 기사에서는 Java 익명 내부 클래스에 대해 논의했습니다. 우리는 일반 클래스와 익명 내부 클래스의 차이점을 보았습니다.

또한 Java 익명 내부 클래스의 사용법과 이점에 대해서도 논의했습니다. 또한 코드와 예제를 통해 구현 및 구문을 이해했습니다. 우리는 다양한 유형의 Java 익명 내부 클래스에 대해서도 배웠습니다.

결론적으로 Java의 익명 내부 클래스는 재사용성을 제공하고 장황함을 줄임으로써 언어의 기능과 다양성을 추가합니다.

관련 문장 - Java Class