ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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에서는 변경할 수 없는 값입니다.
      }
    
    }
    반응형

    댓글

Designed by Tistory.