자바 - 익명클래스(anonymous class)

업데이트:

java-logo

익명 클래스

문법

익명 클래스는 이름이 없는 클래스를 말한다. 이름이 없기에 클래스를 정의하자 마자 바로 인스턴스를 생성해야 한다. 일반적으로 인스턴스를 딱 한 개만 만들 때 익명 클래스로 정의한다.

익명클래스를 만들기 위해선 조건이 있다.

어떤 클래스를 상속하거나 인터페이스를 구현해야 한다.

문법은 다음과 같다.

[상속]
수퍼클래스 변수 = new 수퍼클래스(){...};

[구현]
인터페이스 변수 = new 인터페이스(){...};
  • 여기서 수퍼클래스 변수는 이름이 없는 익명클래스 객체를 참조하고, 인터페이스 변수는 이름이 없는 구현 객체를 참조하게 된다.

  • 익명클래스는 하나의 실행문이므로 반드시 세미콜론(;)을 붙여줘야 한다!

익명클래스 - 클래스 상속

  • 클래스는 스태틱으로 선언해야만 스태틱 멤버에서 접근할 수 있다.
public class Exam0210 {
  // 클래스는 스태틱으로 선언해야만 스태틱 멤버에서 접근할 수 있다!!
  static abstract class A {
    public abstract void print();
  }

  public static void main(final String[] args) {
    // 클래스를 상속 받는 익명 클래스 만들기
    // 문법:
    // => 클래스명 레퍼런스 = new 클래스명(생성자 파라미터, ...) {};
    //
    A obj = new A() {
      @Override
      public void print() {
        System.out.println("Hello2!");
      }
    };
    obj.print();
  }
}
  • 익명 클래스를 정의할 때 호출할 수퍼클래스의 생성자가 여러개라면, 생성자를 지정할 수 있다.
  • 익명클래스도 클래스이기 때문에 당연히 상속받은 수퍼클래스의 메서드를 오버라이딩 할 수 있다.

익명클래스 - 인터페이스 구현

인터페이스 구현 클래스가 재사용되지 않고, 오로지 특정 위치에서 사용할 경우라면 구현 클래스를 명시적으로 선언하는 것은 번거로운 일이 된다. 이런 경우 익명 구현 객체 를 생성해서 사용하는 것이 좋다.

  • 인터페이스의 경우 static으로 선언하지 않아도 스태틱 멤버에서 사용할 수 있다.
public class Exam0120 {
  // 인터페이스의 경우 static으로 선언하지 않아도 스태틱 멤버에서 사용할 수 있다.
  interface A {
    void print();
  }

  public static void main(final String[] args) {
    // 익명 클래스로 인터페이스 구현하기
    // 문법:
    // => 인터페이스명 레퍼런스 = new 인터페이스명() {}
    //
    A obj = new A() {
      @Override
      public void print() {
        System.out.println("Hello!");
      }
    };

    obj.print();
  }
}
  • 로컬 변수의 값을 준비할 때 익명 클래스를 사용할 수 있다.
public class Exam0430 {
  interface A {
    void print();
  }

  void m1() {
    // 로컬 변수의 값을 준비할 때 익명 클래스를 사용할 수 있다.
    A obj = new A() {
      @Override
      public void print() {
        System.out.println("Hello!");
      }
    };
    obj.print();
  }
  
  public static void main(String[] args) {
    Exam0430 r = new Exam0430();
    r.m1();
  }
}

댓글남기기