람다 표현식은 자바 8버전부터 생긴 자바 문법으로, 영어로 Lamda Expression이라고 하고 줄여서 람다식이라고도 부른다.
자바에서 람다 표현식은 익명 함수(Anonymous Function)을 의미하기도 하며 익명 함수의 한 종류이기도 하다.
그렇다면 자바에서 왜 람다 표현식을 익명 함수라고 하는 걸까? 자바에서 함수는 메서드라고 불린다. 이 메서드는 메서드명이 필요하다. 그런데 람다 표현식에는 메서드명이 없다. 메서드명이 없는 것을 익명이라는 단어로 표현한 것이다. 따라서 자바에서 메서드명이 없는 형태이므로 익명 함수라고 부르고 이를 람다 표현식이라고도 부르는 것이다.
람다식은 병렬처리, 이벤트 처리 등 함수적 프로그래밍에서 유용하게 쓰인다.
이런 람다 표현식의 장점있지만 단점도 분명하기에 무조건 좋은건 아니다. 그러므로 적절하게 사용하자.
우선 람다 표현식의 형태를 알아보기 전에 자바의 메서드 형태부터 살펴보자.
'''java
접근 제한자 메서드의 타입 메서드명 (타입1 파라미터1, 타입2 파라미터2, ...){
메서드 호출 시 실행할 명령문
}
'''
이제 람다 표현식의 형태를 살펴보자.
'''java
(타입 파라미터) -> {명령문}
'''
이렇게 람다 표현식은 접근 제한자, 메서드의 타입, 메서드 명이 없다. 또한, 만약, 람다 표현식의 타입이 void인 경우 생략이 가능하다.
람다 표현식의 형태는 이와 같으나 의식하고 써야 할 부분이 있다. 바로 람다 표현식은 파라미터와 명령문이 몇 개인지에 따라 형태가 조금씩 다르다는 것이다. 이를 알아보자.
참고)
1. 타입은 자료형의 다른 말이다.
2. 파라미터는 매개변수의 다른 말이다.
람다 표현식의 파라미터가 1개인 경우, 파라미터를 감싸는 소괄호를 생략할 수 있다. 또한, 명령문이 1개인 경우 명령문을 감싸는 중괄호를 생략할 수 있고 명령문에 쓰이는 세미콜론도 생략할 수 있다.
예를 들어,
var1 -> System.out.println(var1)
같은 형태인 코드가 있다고 해보자.
우선 파라미터의 타입이 생략되어 있으므로 파라미터의 타입은 void인 것이다.
이때, 명령문의 결과가 이 람다 표현식의 리턴 값이된다.
System.out.println은 리턴 값이 void이기 때문에 이 람다 표현식의 리턴 값도 역시 void 타입을 띄고 있다
참고) 리턴 값은 반환 값의 다른 말이다.
파라미터가 1개, 명령문이 2개 이상인 경우에는 파라미터가 1개이므로 소괄호를 생략할 수 있다. 명령문이 2개 이상인 경우 반드시 중괄호로 명령문을 감싸야 한다.
var1 -> {
var1 = var1 + 1;
System.out.println(var);
return var1;
}
파라미터에서 var1의 타입이 명시되지 않았다. 타입이 명시되어 있지 않으면 람다 표현식에서는 자동으로 void로 인식하기 때문에 파라미터들의 타입은 void다. System.out.println의 리턴 값은 리턴 타입이 void 이므로 리턴 값의 타입은 void 이다.
파라미터가 2개 이상인 경우 반드시 소괄호로 파라미터를 감싸야 한다. 명령문은 1개이므로 중괄호와 명령문의 세미콜론은 생략해도 된다.
(var1, var2) -> System.out.println(var1 + var2);
파라미터에서 var1과 var2의 타입이 명시되지 않았다. 타입이 명시되어 있지 않으면 자동으로 void로 인식하기 때문에 파라미터들의 타입은 void다. System.out.println의 리턴 값은 리턴 타입이 void 이므로 리턴 값의 타입은 void 이다.
이 경우에서는 파라미터가 2개 이상이므로 반드시 소괄호로 감싸야 하고, 명령문도 2개 이상이므로 반드시 명령문을 중괄호로 감싸야 한다.
이를 명심하며 코드를 짜보자.
(var1, var2) -> {
System.out.println(var1);
System.out.println(var2);
}
파라미터에서 var1과 var2의 타입이 명시되지 않았다. 타입이 명시되어 있지 않으면 자동으로 void로 인식하기 때문에 파라미터들의 타입은 void다. System.out.println의 리턴 값에도 리턴 타입이 void 이므로 리턴 값은 void 타입을 띈다.
위의 형태들에서 한 가지 궁금증이 생길 것이다.
'System.out.println(); 에서 () 사이에 ""가 있어야 출력이 가능한데 이건 왜 이렇게 되는 것이지?' 같은 궁금증 말이다.
이런 것이 가능한 이유는 System.out.println(); 형태로 쓰는 이유는 람다 표현식 내부에서 변수나 메서드를 호출할 수 있기 때문이다.
이번에는 자바의 특정 코드의 익명 클래스를 람다 표현식으로 만들어보자.
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Lamda {
public static void main(String[] args){
List list = new ArrayList<String>();
list.add("short");
list.add("int");
list.add("long");
// 익명 클래스
list.sort(new Comparator<String>()) {
@Override
public int compare(String str1, String str2){
return str1.compareTo(str2)
}
}
}
}
이 코드를 람다 표현식을 활용하여 바꿔보자.
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Lamda {
public static void main(String[] args){
List list = new ArrayList<String>();
list.add("short");
list.add("int");
list.add("long");
// 람다 표현식
list.sort((Comparator<String>) (str1, str2) -> str1.compareTo(str2));
}
}
이처럼 람다 표현식을 사용하면 더 간결하게 코드를 작성할 수 있다.
참고 문헌:
1. https://hstory0208.tistory.com/entry/Java%EC%9E%90%EB%B0%94-%EB%9E%8C%EB%8B%A4%EC%8B%9DLambda%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95
2. https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95
3. https://velog.io/@soup930/JAVA-%EB%9E%8C%EB%8B%A4Lambda-%EC%95%8C%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EC%9E%90
4. https://mangkyu.tistory.com/113
5. https://makecodework.tistory.com/entry/Java-%EB%9E%8C%EB%8B%A4%EC%8B%9DLambda-%EC%9D%B5%ED%9E%88%EA%B8%B0
6. https://medium.com/@khj93/java-%EB%9E%8C%EB%8B%A4%EC%8B%9D-lambda-%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95-34ee86f6c1d7
7. https://inpa.tistory.com/entry/%E2%98%95-Lambda-Expression
8. https://www.tcpschool.com/java/java_lambda_concept#google_vignette
9. https://velog.io/@tsi0521/java-Lambda
10. https://itkjspo56.tistory.com/289#google_vignette
11. https://yozm.wishket.com/magazine/detail/2023/
12. 이것이 취업을 위한 백엔드 개발이다. , 이준형 저, p.84 ~ p.87