다이아몬드 연산자(diamond operator, <>)는 Java 7에서 코드의 가독성을 높이기 위해 도입되었습니다. 하지만 초기 버전에서는 익명 내부 클래스(anonymous inner class)에는 사용할 수 없었다는 제한이 있었습니다.
Java 9부터는 이러한 제한이 해소되어, 다이아몬드 연산자를 익명 내부 클래스와 함께 사용할 수 있게 되었습니다. 이를 통해 제네릭 타입을 중복으로 명시할 필요가 없어지고 코드가 훨씬 간결해집니다.
사용 예제
아래 예제는 Java 9에서 익명 클래스에 다이아몬드 연산자를 적용하는 방법을 보여줍니다. 세 가지 타입 인자(Integer, 와일드카드 extends Number, 비한정 와일드카드 ?)를 사용하는 경우를 모두 확인할 수 있습니다.
public class DiamondOperatorTest {
public static void main(String args[]) {
Handler<Integer> intHandler = new Handler<>(1) {
@Override
public void handle() {
System.out.println(data);
}
};
intHandler.handle();
Handler<? extends Number> intHandler1 = new Handler<>(2) {
@Override
public void handle() {
System.out.println(data);
}
};
intHandler1.handle();
Handler<?> handler = new Handler<>("test") {
@Override
public void handle() {
System.out.println(data);
}
};
handler.handle();
}
}
abstract class Handler<T> {
public T data;
public Handler(T data) {
this.data = data;
}
abstract void handle();
}실행 결과
1 2 test
핵심 정리
- Java 7에서 도입된 다이아몬드 연산자는 원래 일반 객체 생성 시에만 사용 가능했습니다.
- Java 9(JEP 213)부터 익명 내부 클래스에서도 다이아몬드 연산자를 사용할 수 있습니다.
- 단, 컴파일러가 추론 가능한 타입이어야 하며, 익명 클래스가 새로운 타입 인자를 추가로 선언하는 경우에는 적용되지 않습니다.