Java

[Java]익명 클래스(Anonymous Class)

DevStory 2022. 6. 21.

익명 클래스(Anonymous Class)

이번 포스팅에서는 Java의 익명 클래스에 대해 소개합니다.

 

Java에서 다른 클래스 내에서 클래스를 정의할 수 있으며 정의된 클래스를 중첩 클래스라고 말합니다. 중첩 클래스는 이름을 설정하지 않고 생성할 수 있으며, 이름이 없는 중첩 클래스를 익명 클래스라고 합니다. 

 

익명 클래스는 다른 클래스 내부에 정의되므로 익명 내부 클래스라고 말하기도 하며, 다음과 같이 정의됩니다.

class OuterClass {
  // 익명 클래스 정의
  object = new Type(parameterList) {
    // 익명 클래스의 내부
  }
}

위 예제의 object는 런타임에 익명 클래스의 객체를 생성하며, 익명 클래스는 일반적으로 하위 클래스를 확장하거나 인터페이스를 구현합니다.


익명 클래스 예제

일반적으로 인터페이스의 추상 메서드를 사용하기 위해서는 구현 클래스가 필요합니다.

 

다음 예제는 인터페이스 선언 및 구현 클래스를 정의합니다.

// 인터페이스 선언
public interface InterfaceTest {
  // 추상 메서드 선언
  public void show();
}

// 구현 클래스 정의
public class MyClass implements InterfaceTest {
  @Override
  public void show() {
    System.out.println("MyClass 내부의 show() 메서드 호출");
  }
}

public class Main {
  public static void main(String args[]) {
    MyClass obj = new MyClass();
    obj.show();
  }
}

실행 결과

MyClass 내부의 show() 메서드 호출

MyClass는 InterfaceTest 인터페이스의 구현 클래스입니다.

 

Main문을 다음 예제처럼 변경하면 구현 클래스를 정의할 필요가 없습니다.

// 인터페이스 선언
public interface InterfaceTest {
  // 추상 메서드 선언
  public void show();
}

public class Main {
  public static void main(String args[]) {
    InterfaceTest obj = new InterfaceTest()
    {
      public void show() {
        System.out.println("익명 클래스의 show() 메서드");
      }
    };

    obj.show();
  }
}

실행 결과

익명 클래스의 show() 메서드

익명 클래스의 유형

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

1. 클래스를 확장하는 익명 내부 클래스

2. 인터페이스를 구현하는 익명 내부 클래스

3. 내부 메서드/생상지 인수를 정의하는 익명 내부 클래스


클래스 확장

클래스를 확장하는 익명 내부 클래스는 상속 없이 메서드를 재정의하기 위해 사용됩니다.

public class MyClass {
  public void show() {
    System.out.println("MyClass의 show() 메서드 호출");
  }
}

public class Main {
  public static void main(String args[]) {
    MyClass obj1 = new MyClass();
    obj1.show();

    MyClass obj2 = new MyClass(){
      @Override
      public void show() {
        System.out.println("show() 메서드 재정의");
      }
    };

    obj2.show();
  }
}

실행 결과

MyClass의 show() 메서드 호출
show() 메서드 재정의

인터페이스 구현

인터페이스를 구현하는 익명 내부 클래스는 구현 클래스를 정의하지 않고 인터페이스를 참조하는 익명 내부 클래스의 객체를 생성하기 위해 사용됩니다.

// 인터페이스 선언
public interface InterfaceTest {
  // 추상 메서드 선언
  public void show();
}

public class Main {
  public static void main(String args[]) {
    InterfaceTest obj = new InterfaceTest()
    {
      public void show() {
        System.out.println("익명 클래스의 show() 메서드");
      }
    };

    obj.show();
  }
}

실행 결과

익명 클래스의 show() 메서드

내부 메서드/생성자 인수 정의

익명 내부 클래스를 인수로 하여 메서드 또는 생성자에 전달할 수 있습니다.

public interface InterfaceTest {
  public void show();
}

public class MyClass {
  public void show(InterfaceTest it) {
    it.show();
  }
}

public class Main {
  public static void main(String args[]) {
    MyClass obj = new MyClass();
    obj.show(new InterfaceTest() {
      @Override
      public void show() {
        System.out.println("Hello");
      }
    });
  }
}

실행 결과

Hello

정리

  • 익명 내부 클래스는 클래스를 정의하지 않고 특정 작업을 수행하기 위해 사용됩니다.
  • 익명 내부 클래스는 일반적으로 하위 클래스를 확장하거나 인터페이스를 구현합니다.
반응형

댓글