자바의 람다는 javaScript의 arrow function과 유사한 개념으로, 함수형 프로그래밍 언어에 적합한 표현식이기 때문에 객체지향과는 약간 괴리가 있지만 이 익명 클래스를 통해 구현할 수 있다. 

JDK 1.8이 람다식을 지원함으로써 자바 프로그램은 객체지향+함수형 프로그램이 되었다.

 

람다 표현식(Lambda expression)은 익명 함수(anonymous function)를 생성하기 위한 식으로, 객체 지향 언어보다는 함수형 언어의 표현식에 가깝다. 

함수형 언어의 장점은 병렬처리와 이벤트 처리에 적합하다는 것이다.

 

자바에서 람다 표현식을 사용하면 함수형 언어의 장점을 자바로 가져오는 것과 동시에 코드가 매우 간결해진다. 

또한 JCF의 요소를 필터링 하거나 매핑해서 원하는 결과를 얻는 것이 한결 쉬워지기 때문에 JCF와 연계해서도 많이 사용된다.

 

일반적으로 람다식의 형태는 파라미터를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체(익명 클래스)를 생성한다. 

이게 무슨 말일까? 이를 이해하기 위해서 이번 포스팅에서는 다음과 같은 내용들을 다룬다.

 

1. 람다 표현식 기본 문법

2. 함수형 인터페이스

3. 표준 함수형 인터페이스 API

 

<람다 표현식 기본 문법>

(타입 파라미터1[, ...]) -> {실행문1;[...]}

 

(int a) -> {System.out.println(a);}

(a) -> {System.out.println(a);}

a -> System.out.println(a) // 하나의 매개변수만 있는 경우 {} 를 생략 가능, 단, 파라미터가 없다면 ()를 생략할 수 없다.

(x,y) -> {return x+y;}; // 가능

(x,y) -> x+y //이것도 가능

 

 

<함수형 인터페이스>

위에서 interface와 익명클래스를 잠시 언급했었는데, 람다식은 interface의 익명 구현 객체(익명 클래스)를 생성하기 때문에 interface와 밀접한 관련이 있다. 

interface는 직접 객체화할 수 없기 때문에 구현 클래스가 필요한데, 람다식은 사용 대상 interface의 익명 구현 클래스를 생성하고 객체화한다. 

즉, 람다식은 다음과 같이 사용될 수 있다.

 

인터페이스 변수이름 = 람다식; 

 

이렇게 사용되는 경우 람다식은 interface 종류에 따라 작성 방법이 달라진다. 

그리고 여기서 람다식이 대입될 interface를 람다식의 ‘타겟타입(target type)’ 이라고 한다. 

하지만 모든 interface가 람다식의 타겟타입이 될 수 있는 것은 아니다. 

람다식은 개념상 하나의 메서드만을 정의하기 때문에 두 개 이상의 추상 메서드가 선언된 interface는 람다식을 이용하여 구현 객체를 생성할 수 없다는 말이다. 

다시말해, 단 하나의 추상메서드만이 선언된 interface만이 람다식의 타겟타입이 될 수 있는데, 이런 인터페이스를 함수형 인터페이스(functional interface)라고 한다. 

정리하면 다음과 같다.

 

// 타겟타입(인터페이스)은 함수형 인터페이스(무조건 하나의 메서드만 가짐)여야 한다.

인터페이스 변수이름 = 람다식;

 

이처럼 람다식에 대입되는 인터페이스는 하나의 메서드만 가져야 하는데, 이를 명시하기 위한 annotation이 바로 @FunctionalInterface이다. 

인터페이스의 선언부에 이 annotation을 붙여놓으면 컴파일러가 이 인터페이스에 두 개 이상의 추상메서드가 선언되지 않도록 검사한다.

 

 

 

<이하의 나머지 내용은 링크 참조>

 

번호 제목 글쓴이 날짜 조회 수
347 java.util.Optional 에서의 map() 함수의 이해 황제낙엽 2026.06.24 666
346 linux(ubuntu) 의 jdk 21 이 설정된 환경에서 jdk 17 로 다운그레이드 절차 황제낙엽 2025.09.22 1532
345 [ChatGPT] javax.* 패키지와 jakarta.* 패키지의 혼합 사용 방안 황제낙엽 2025.04.15 2459
344 [ChatGPT] *.servlet.http.HttpServlet 클래스를 사용할 수 있는 주요 WAS 목록 황제낙엽 2025.04.14 2038
343 [ChatGPT] JDBC API에서 java.sql과 javax.sql 패키지의 차이점 황제낙엽 2025.01.31 2218
342 jakarta.servlet 패키지를 이용한 File Upload 구현 (2024.03.03, Servlet 5.0) 황제낙엽 2025.01.02 2310
341 [ChatGPT] Java EE가 Jakarta EE로 전환 황제낙엽 2025.01.01 2525
340 [ChatGPT] File.delete() 함수로 파일 삭제가 되지 않는 경우 황제낙엽 2024.12.10 2809
339 [ChatGPT] <jsp:include>에서 flush="true"를 설정시의 몇 가지 문제점 과 대안 황제낙엽 2024.07.19 2493
338 [Copilot] JSP, Servlet, web.xml, mysql 한글 설정 황제낙엽 2024.07.12 2555
337 Base64 클래스의 encode, decode 에서 URL-safe 황제낙엽 2024.07.10 2624
336 [Copilot] JSP 에서 다른 페이지를 현재 페이지에 포함시키는 문법 (include) 황제낙엽 2024.06.26 2570
335 Exception 출력에 대한 고찰 황제낙엽 2024.06.10 2198
334 google-auth-library-oauth2-http 라이브러리 다운로드 황제낙엽 2023.11.19 4025
333 firebase-admin-java 라이브러리 다운로드 (firebase admin sdk library) 황제낙엽 2023.11.19 2805
332 Enum 활용 (개인블로그, Effective Java) file 황제낙엽 2023.11.02 2759
331 Enum 활용 (우아한기술블로그) file 황제낙엽 2023.11.02 2790
330 servlet name 에 camel case 를 사용해서는 안되는 이유 황제낙엽 2023.10.24 2508
329 org.apache.commons.fileupload.servlet.ServletFileUpload 이용 예시 황제낙엽 2023.08.25 3336
328 ServletFileUpload.parseRequest() 실행 결과 리스트가 비어있는 오류 황제낙엽 2023.08.25 2935