개발/Java

[Java] 익명 클래스, 익명 객체란?

선우. 2024. 6. 18. 16:45

1. 익명 클래스란

익명 클래스란, 이름이 없는 클래스입니다.

이름이 없는 이유는 클래스의 정의(선언)과 인스턴스화가 동시에 진행 되기 때문입니다.

public class People {
	...
}

 

우리가 일반적으로 선언하는 명명 클래스는 위과 같은 .java 파일을 별도로 작성합니다.

아래 클래스의 경우 People이 클래스 이름이 됩니다.

 

그렇다면, 익명 클래스는 왜 이름이 없는지 사용법을 통해 알아보겠습니다.

 

2. 어떻게 사용하는가

익명 클래스는 선언과 동시에 인스턴스화 된다고 말씀 드렸는데요, 그렇기에 익명 객체라고도 불립니다.

익명 객체가 구현할 수 있는 대상은 추상 클래스 또는 인터페이스입니다.

AbstractClass extendedObj = new AbstractClass() {
    @Override
    public T method() { ... }
};

Interface Interfaceimpl = new Interface() {
    @Override
    public T method() { ... }
};

 

익명 객체는 생성자를 호출하는 것 처럼 추상 클래스 또는 인터페이스를 new 연산자로 호출합니다.

그리고 중괄호 내부에 추상 메소드들을 구현합니다.

 

이제, 사칙연산이 가능한 Calculator 계산기 클래스를 예를 들어 익명 객체 사용 이유를 알아보겠습니다.

 

3. 왜 사용하는가

일반 클래스

public abstract class Operator {
	public abstract int apply(int x, int y);
}

 

위는 Operator 연산자 추상 클래스입니다.

덧셈, 뺄셈, 곱셈, 나눗셈 연산에 따라 apply 추상 메서드를 구현하면 되는 것이죠.

 

public class Plus extends Operator {
    @Override
    public int apply(int x, int y) {
    	return x + y;
    }
}

 

일반적인 명명 클래스였다면 위와 같이 Operator를 extends해서 Plus라는 클래스를 구현했을 것입니다.

그에 따라 작성되는 Calculator 계산기 클래스는 다음과 같습니다.

 

public class Calculator {
    private Operator plus = new Plus();
    private Operator minus = new Minus();
    ...
}

 

연산자 종류가 늘어날 때 마다 추가적으로 Plus와 같은 클래스를 작성해줘야 할 겁니다.

이제 익명 클래스를 사용할 경우를 살펴보겠습니다.

 

익명 클래스

public class Calculator {
    private Operator plus = new Operator() {
        @Override
        public int apply(int x, int y) {
            return x + y;
        }
    };
    private Operator minus = new Operator() {
        @Override
        public int apply(int x, int y) {
            return x - y;
        }
    };
    ...
}

 

익명 클래스의 경우 Calculator 클래스 하나만으로도 구현이 완료 되었습니다.

즉, 과도한 클래스의 분리를 제거할 수 있습니다.

 

  1. 오직 한 클래스에서만 호출될 것이 분명한 로직을 갖는 클래스 (다른 클래스에서 호출될 일이 없어 재사용성이 없는 클래스)
  2. 간단한 로직을 갖는 클래스

위 두 가지에 해당되는 클래스인 경우, 익명 클래스 사용을 기대할 수 있습니다.

 

4. 참고 사항

익명 클래스는 이벤트 처리에 자주 사용된다.

https://www.inflearn.com/questions/793410

 

익명 클래스의 바이트 코드 파일 이름

익명 클래스 객체도 결국엔 하나의 객체이므로 JVM 상에 .class 바이트 코드로 로드되어야 합니다.

익명 클래스의 경우 자신을 감싼 바깥의 클래스 명을 기준으로 .class 명이 정해집니다.

예시에서는 plus에 할당 된 Operator 타입 익명 클래스는 Calculator$1.class가 됩니다.