Java - 익명 클래스(Anonymous class)

익명 클래스(함수)는 Inner class로, 이름이 없는 클래스를 말합니다. 클래스 정의와 동시에 객체를 생성할 수 있습니다. Java의 Interface와 Class 모두 익명 함수로 객체를 만들 수 있습니다.

익명 함수를 사용하는 이유는, 프로그램 내에서 한번만 객체로 만드는데 사용되는 클래스의 경우 클래스를 정의하고 생성하는 것이 비효율적이기 때문입니다. 익명 함수로 클래스 정의와 구현을 동시에 하여 코드 길이를 줄일 수 있습니다. 이런 이유로, Runnable이나 Event Listener 객체를 생성하는데 주로 사용됩니다.

1. 익명 함수로 Interface 구현 및 객체 생성

Java의 Interface나 Abstract 클래스는 익명 함수로 구현과 동시에 객체를 생성할 수 있습니다.

아래와 같은 방식으로 익명 클래스의 객체를 생성할 수 있습니다.

new InterfaceName() {...}

1.1 예제

먼저 아래와 같이 인터페이스를 정의하였습니다.

interface MyInterface {
    void doSomething();
}

아래와 같이 익명 함수를 사용하여 클래스 구현과 동시에 객체를 생성할 수 있습니다. myClass 객체는 이름이 없는 클래스로 만들어진 객체입니다. 일반적으로 한번만 생성하고 재생성되지 않는 객체를 만들 때 익명 함수를 사용합니다.

public class Example {

    interface MyInterface {
        void doSomething();
    }

    public static void main(String[] args) {

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

Output:

doSomething

2. 익명 함수로 클래스 구현 및 객체 생성

익명 함수를 사용하면 Parent 클래스를 상속하여 클래스를 정의하고 객체를 생성할 수 있습니다.

Syntax는 다음과 같습니다.

new ParentClass() {...}

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

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

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

public class Example2 {

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

    public static void main(String[] args) {

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

3. 익명 함수에서 상수 및 변수 참조

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

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);
    }
};

4. 익명 함수와 람다식의 차이점

Java - 람다식(Lambda)과 함수형 인터페이스 글에서 익명 함수와 람다식의 차이점에 대해서 간단히 작성하였습니다.

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha