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에서는 변경할 수 없는 값입니다.
  }

}
반응형