람다식에 대해서 앞선 아티클에서 간단하게 살펴보았습니다. 복잡해 보이는 설명이기는 했지만, 결국 람다식은 '인터페이스의 구현 객체를 익명으로 선언하는' 것이라는 간단한 정의를 잘 기억하고 있어야 합니다. 지금부터 설명하는 모든 내용이 이 사실을 기반으로 이루어지기 때문이지요.
자, 우리는 앞의 아티클에서 람다식의 기본 형태는 파라미터가 있고, 이를 사용하는 실행 코드 블럭( { } )이 있는 형태라고 배웠습니다.
람다식(1) - 람다식의 정의와 기본 문법
람다식은 익명 함수(anonymous function)를 생성하기 위한 식입니다. 이는 객체 지향 언어라기보다는, 함수 지향 언어에 가까운 성격을 갖고 있습니다. 일단 기존의 코드 작성 레이아웃과 약간의 차이
nozeroslope.tistory.com
그런데 이 형태는 어디서 많이 본 것이죠? 바로 "메서드"를 선언하는 방식과 똑같습니다. 그런데 우리는 지금까지 메서드를 선언할 때 반드시 클래스의 구성 멤버로서 선언해 왔죠. 여기서도 똑같이 생각해 주시면 됩니다. 이 람다식(메서드)이 선언되려면 결국 이를 포함하는 하나의 객체(클래스)가 있어야 한다는 얘기죠. 그런데 람다식은 별도의 클래스가 없는 상태에서 선언됩니다! 그러므로 임의의 익명 객체를 생성하게 됩니다.
그런데 람다식은 아래와 같이 특정 인터페이스 타입의 변수에 대입하게 됩니다. 결국 여기서 만들어지는 '익명의 객체'는 '해당 인터페이스의 구현 객체'가 된다는 이야기입니다.
인터페이스 변수 = 람다식;
Runnable runnable = () -> { ... };
Runnable runnable = new Runnable() {
...
};
앞선 아티클에서 살펴본 람다식의 예시입니다. 위의 경우 Runnable이라는 인터페이스 타입을 구현하는 익명의 객체를 생성해, 그 안에서 메서드의 재정의가 이루어지게 되는 구조였습니다. 앞선 아티클에서 살펴본 내용인 것 같지만, 중요한 내용이므로 다시 한번 꼼꼼하게 짚어봤다고 생각해 주세요.
이제 람다식은 이러한 관점에서, 대입될 인터페이스의 종류에 따라 작성 방식에 영향을 받게 됩니다. 그래서 이러한 인터페이스를 람다식의 타겟 타입(target type)이라고 칭하게 됩니다. 즉, 어떤 인터페이스를 구현하려는 것인지 확인이 필요하다는 것이죠.
함수적 인터페이스(@FunctionalInterface)
"람다식은 인터페이스를 익명 객체로 구현한다."라고 정리했습니다. 자, 그러면 우리가 JAVA에서 사용할 수 있는 모든 인터페이스를 람다식의 타겟 타입으로 사용할 수 있는 것일까요? 결론만 말하자면 'NO'입니다. 왜일까요?
기본적으로 람다식은 한 개의 메서드만을 정의합니다. 그러므로 람다식의 타겟 타입은, 추상 메서드가 딱 하나만 선언된 인터페이스여야 합니다. 간단하면서도 엄격한 조건이죠? 그래서 이런 추상 메서드가 하나만 선언된 인터페이스를 '함수적 인터페이스(functional interface)'라고 별도로 칭하는 것입니다.
JAVA에서는 람다식 사용을 위해 이러한 함수적 인터페이서 작성 시 두 개 이상의 메서드가 작성되지 않도록 별도의 어노테이션을 통해 컴파일러가 체크하도록 만들 수 있습니다. 바로 @FunctionalInterface입니다. 이 어노테이션이 있는 인터페이스의 경우 두 개 이상의 추상 메서드가 선언되면 컴파일 오류가 발생하게 됩니다. 물론 저 어노테이션이 없다고 하더라도 추상 메서드가 하나라면 함수적 인터페이스입니다.
@FunctionalInterface
public interface FunctionalInterfaceEx {
public void method();
// public void method2();
}
이제 여기서 선언된 추상 메서드의 선언 형태(파라미터, 리턴 값)에 따라서 람다식 작성 방법이 조금씩 달라지게 됩니다. 이 자세한 방식에 대해서 다음 아티클부터 살펴보도록 하겠습니다.
'Programming > JAVA' 카테고리의 다른 글
람다식(2) - 람다식의 타겟 타입, 함수적 인터페이스 3 (0) | 2023.05.16 |
---|---|
람다식(2) - 람다식의 타겟 타입, 함수적 인터페이스 2 (0) | 2023.05.15 |
람다식(1) - 람다식의 정의와 기본 문법 (0) | 2023.05.10 |
제네릭(6) - 제네릭 타입의 상속과 구현 (0) | 2023.05.09 |
제네릭(5) - 와일드카드 타입 (0) | 2023.05.06 |