자바의 익명 클래스
익명 클래스란 기존에 클래스를 작성하는 방법과 다르게 이름이 없고 선언과 동시에 구현하는 클래스를 말한다. 익명클래스는 자바 1.1에서 도입되었다고 한다. (관련 스택오버플로우 글 참고)
오라클의 공식 튜토리얼에서 다음과 같이 말하고 있다.
Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.
익명 클래스는 코드를 더 간결하게 만들어주고, 선언과 동시에 인스턴스화 할 수 있게 해준다. 이름이 없는 로컬 클래스와 비슷하지만, 클래스를 한번만 사용할 때 사용한다.
여기서 중요한 포인트는, 한번만 사용할 때 사용한다는 것이다.
익명 클래스 예시
익명 클래스는 클래스를 확장하거나 인터페이스를 구현한다. 스레드 처리를 위한 Runnable 인터페이스를 익명 클래스를 통해 구현해보자.
Thread thread = new Threaed(new Runnable() {
// Runnable 인터페이스의 run() 메서드를 구현해야한다.
@Override
public void run() {
...
}
});위처럼 익명 클래스는 별도의 클래스로 작성하지 않아도 되고, 코드를 더 간결하게 작성할 수 있다. 하지만, 익명 클래스는 한번만 사용할 수 있으므로, 재사용이 불가능하다. 이점을 유의하자. 클래스 이름을 생각하지 않아도 되는 점은 좋은 것 같다.
람다식이란?
람다식은 자바 8에서 도입되었다고 한다. 람다식은 익명클래스보다 더 간결하게 작성할 수 있게 해준다.
람다식이 도입되고 나서 핵심적으로 바뀐 것은 함수형 프로그래밍이다. 함수형 프로그래밍은 함수를 일급 객체(first-class -citizen)로 취급하는 프로그래밍 패러다임이다. 이를 통해 자바에서도 인자로 함수를 전달하고 반환하는 것들이 가능해졌다.
람다식은 어떤 인터페이스가 함수형 인터페이스의 형식에 맞다면 사용할 수 있다. 함수형 인터페이스란, 하나의 추상 메서드를 가지고 있는 인터페이스를 말한다.
@FunctionalInterface 어노테이션을 붙이면 컴파일러가 정확히 하나의 메서드를 가지고 있는지 검사해준다. 하지만 필수는 아니다. 붙이지 않고, 하나의 메서드만 있으면 사용할 수 있다.
@FunctionalInterface
public interface CarInterface {
void drive();
}주행 밖에 안되는 자동차 인터페이스를 하나 선언해보겠다.
CarInterface car = () => {
System.out.println("부릉부릉");
}위에서 보듯이, 람다식을 통해 인터페이스를 구현할 수 있다. 왜냐하면, 하나의 메서드를 가지고 있기 때문에 컴파일러에서 어떠한 메서드를 구현해야하는지 알 수 있기 때문이다.
람다식으로 표현하는 익명 클래스
람다식은 자바 8에서 도입되었다고 한다. 람다식은 익명클래스보다 더 간결하게 작성할 수 있게 해준다.
익명 클래스를 람다식으로 변환하는 것에는 유의해야할 제약사항이 있는데 다음과 같다.
익명 클래스가 하나의 메서드만 가져야만 한다는 것이다.