BackEnd/Java
Java8. 람다 표현식 (Lambda Expressions)
hanseom
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에서는 변경할 수 없는 값입니다.
}
}
반응형