sitelink1 https://blog.naver.com/jwyoon25/221335515818 
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  

자바의 람다는 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을 붙여놓으면 컴파일러가 이 인터페이스에 두 개 이상의 추상메서드가 선언되지 않도록 검사한다.

 

 

 

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

 

번호 제목 글쓴이 날짜 조회 수
173 google-auth-library-oauth2-http 라이브러리 다운로드 황제낙엽 2023.11.19 10
172 firebase-admin-java 라이브러리 다운로드 (firebase admin sdk library) 황제낙엽 2023.11.19 1
171 Enum 활용 (개인블로그, Effective Java) file 황제낙엽 2023.11.02 1
170 Enum 활용 (우아한기술블로그) file 황제낙엽 2023.11.02 5
169 [JsonNode] depth 가 여러 단계인 json data 내부를 조회하는 java code 예제 (from Bard) file 황제낙엽 2023.08.09 20
168 JPA 개요 황제낙엽 2023.07.25 3
167 javax.mail 샘플 몇가지 (테스트 수행전) 황제낙엽 2023.06.26 3
166 java 프로그램으로 회원가입용 인증 메일을 보내는 방법 (from naver / 테스트 성공) file 황제낙엽 2023.06.24 219
165 java 프로그램으로 회원가입용 인증 메일을 보내는 방법 (from bing / 테스트 실패) [1] 황제낙엽 2023.06.23 3
164 base64 encode, decode 황제낙엽 2023.06.12 8
163 BASE64Encoder, BASE64Decoder 의 deprecated 황제낙엽 2023.06.12 1
162 java로 알파벳 대소문자를 랜덤으로 조합하는 코드 만들어줘 (ChatGPT) 황제낙엽 2023.03.28 1
161 구글 클라우드 비전 API 사용하기 (Google Cloud Vision API) 황제낙엽 2023.02.22 8
160 람다식(Lambda Expressions in Java) file 황제낙엽 2022.12.03 2
159 ConcurrentLinkedQueue와 LinkedBlockingQueue 황제낙엽 2022.04.06 17
158 java.util.Queue file 황제낙엽 2022.04.06 5382
157 HP-UX, IBM-AIX 황제낙엽 2021.06.23 55
» 람다(Lambda)와 함수형 인터페이스 황제낙엽 2021.05.10 19
155 for, while 등의 loop구문에서 sleep하기 황제낙엽 2020.12.04 55
154 미디어 파일의 metadata를 읽자 (metadata-extractor) file 황제낙엽 2020.08.30 583