Java - 익명 클래스(Anonymous class)

JS · 24 Oct 2020

익명 클래스는 Inner class로, 이름이 없는 클래스를 말합니다. 클래스 정의와 동시에 객체를 생성할 수 있습니다.

Interface, Class 모두 익명 클래스로 객체를 만들 수 있습니다.

익명 클래스를 사용하는 이유는 프로그램 내에서 한번만 객체로 만드는데 사용되는 클래스를 굳이 정의할 필요가 없기 때문입니다. 이런 이유로, Runnable이나 Event Listener 객체를 생성하는데 주로 사용됩니다.

Interface 구현 및 객체 생성

인터페이스를 구현과 동시에 객체를 생성할 수 있습니다.

Syntax는 다음과 같습니다.

new InterfaceName() {...}

예제

다음과 같은 인터페이스를 정의하였습니다.

public abstract class MyInterface {
    public abstract void doSomething();
}

다음과 같이 인터페이스 구현과 동시에 객체를 생성할 수 있습니다. 이름이 없는 객체이기 때문에, 다시 동일한 객체를 만드려면 동일한 코드로 인터페이스를 구현해야 합니다.

MyInterface myClass = new MyInterface() {
    @Override
    public void doSomething() {
        System.out.println("doSomething");
    }
};

myClass.doSomething();

Output:

doSomething

클래스 정의 및 객체 생성

Parent 클래스를 상속하여 클래스를 정의하고 객체를 생성할 수 있습니다.

Syntax는 다음과 같습니다.

new ParentClass() {...}

다음과 같이 Parent 클래스를 정의하였습니다. (abstract로 만들어도 되고, 일반 클래스로 만들어도 됩니다.)

public abstract class MyAbstractClass {
    public abstract void doSomething();
}

다음과 같이 클래스 정의와 동시에 객체를 생성할 수 있습니다.

MyAbstractClass myClass = new MyAbstractClass() {
    @Override
    public void doSomething() {
        System.out.println("doSomething");
    }
};

myClass.doSomething();

익명 클래스에서 상수 및 변수 참조

다음과 같이 익명 클래스 내에 멤버 변수는 참조할 수 있습니다.

MyInterface myClass = new MyInterface() {
    private int bb = 0;

    @Override
    public void doSomething() {
        System.out.println("doSomething: " + bb);
    }
};

static의 경우 static final로 선언한 상수는 참조 가능하지만, final이 아닌 static 변수는 참조할 수 없고, 컴파일 에러가 발생합니다.

MyInterface myClass = new MyInterface() {
    static final int AA = 0;
    // static int aa = 0; // compile error

    @Override
    public void doSomething() {
        System.out.println("doSomething: " + AA);
    }
};

익명 클래스 외부의 변수는 final 또는 Effectively final만 참조할 수 있습니다. 아래 코드는 컴파일이 됩니다.

int aa = 0;
final int bb = 0;
MyInterface myClass = new MyInterface() {
    private int bb = 0;

    @Override
    public void doSomething() {
        System.out.println("doSomething: " + aa);
        System.out.println("doSomething: " + bb);
    }
};
댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha