-
Java8. 람다 표현식 (Lambda Expressions)BackEnd/Java 2022. 1. 20. 22:54반응형
람다 표현식(Lambda Expressions)이란 메소드를 하나의 식으로 표현하는 것으로, (매개변수 목록) -> { Body } 형태를 가집니다. IntelliJ 사용 시 아래 이미지처럼 회색으로 표시된 부분에서 Option + Enter를 누르면 자동으로 변환이 가능합니다.
매개변수 목록
- 매개변수가 없는 경우: ()
- 매개변수가 한 개인 경우: (i) or i
- 매개변수가 여러개인 경우: (i, j)
- 매개변수의 타입은 컴파일러가 추론하기에 생략이 가능하나 명시할 수도 있습니다. (Integer i, Integer j)
Body
화살표 오른쪽에 함수 본문을 정의하며, 여러 줄인 경우 {}를 사용해서 묶습니다. 한 줄인 경우에는 생략이 가능합니다. (return도 생략 가능)
람다 표현식에서는 final이거나 effective final인 변수만 참조가 가능합니다. 그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일이 되지 않습니다. 아래 코드는 로컬클래스와 익명클래스에서는 로컬변수 s를 재정의하여 사용이 가능하나(새로운 Scope), 람다 표현식에서는 재정의하지 못하는 것을(람다는 람다를 감싸고 있는 Scope와 동일) 보여줍니다.
import java.util.function.Consumer; public class Lambda { public static void main(String[] args) { Lambda lambda = new Lambda(); lambda.run(); } private void run() { String s = "변경할 수 없는 값입니다."; // final String s = "변경할 수 없는 값입니다."; // Local Class: New Scope class LocalClass { void print() { String s = "Local Class"; // Shadowing System.out.println(s); } } LocalClass localClass = new LocalClass(); localClass.print(); // [결과]: Local Class // Anonymous Class: New Scope Consumer<String> consumer = new Consumer<String>() { @Override public void accept(String s) { // Shadowing System.out.println(s); } }; consumer.accept("Anonymous Class"); // [결과]: Anonymous Class // Lambda Expressions Consumer<String> lambda = (str) -> { // String s = "Lambda Expressions"; // Compile Error: 람다는 람다를 감싸고 있는 Scope와 같습니다. System.out.println(str + "에서는 " + s); }; lambda.accept("Lambda Expressions"); // [결과]: Lambda Expressions에서는 변경할 수 없는 값입니다. } }
반응형'BackEnd > Java' 카테고리의 다른 글
Java8. Optional (0) 2022.01.22 Java8. 스트림 (Stream) (0) 2022.01.22 Java8. 기본 메소드 (Default Method)와 스태틱 메소드 (Static Method) (0) 2022.01.22 Java8. 메소드 레퍼런스 (Method Reference) (0) 2022.01.20 Java8. 함수형 인터페이스 (Functional Interface) (0) 2022.01.20