본문 바로가기
Java/java상식

자바 람다식이란?

by 붕어사랑 티스토리 2021. 7. 7.
반응형

https://javabydeveloper.com/java-lambda-expression-with-examples/

 

Java Lambda Expression with examples - Java Tutorials

In this tutorial, we will discuss what is Java 8 Lambda Expression and how to is use it in Java with several examples.

javabydeveloper.com

해당글은 상기 링크의 내용을 참고하여 작성하였습니다.

 

1. 람다식이란?

  • 자바 람다식이란 어느 클래스에도 속하지 않은 메소드를 의미한다
  • 람다식은 익명함수 이며 메소드를 argument로 넘겨주는것이 가능하다
  • 람다식은 자바에 함수형 프로그래밍의 이점을 가져오기 위해 도입하였다

 

2. 람다식 문법

람다식은 아래 세개의 구성요소로 이루어져 있다

 

  • Argument-list : 람다식의 argument. empty여도 된다
  • Arrow-token: arguments-list와 body를 연결해주는 기능을 한다.
  • Body: 람다식의 로직을 담는다.

예제

(int a, int b) -> {System.out.println(a+b);};

 

 

2.1 argument의 타입은 컴파일러에 의해 자동으로 결정될 수 있습니다.

즉 아래와 같이 타입을 생략 할 수 있습니다.

(a, b) -> {System.out.println(a+b);};

 

 

2.2 argument자리의 파라미터가 하나이고 컴파일러에 의해 타입이 유추될 수 있으면 아래와 같이 argument자리의 () 괄호를 생략 할 수 있습니다.

num -> {System.out.println(num % 2);};

 

2.3 body에 여러 statements 를 작성 할 수 있습니다. 여러 코드줄을 작성할경우 {} curly brace로 묵어주어야 합니다.

num -> {
		System.out.println(num % 2);
		System.out.println(num > 10);
	};

만약 함수가 한줄이면 curly brace를 생략 할 수 있습니다.

num -> System.out.println(num % 2);

 

2.4 람다식을 작성하면 메소드 호출하듯이 호출 할 수 있습니다. 여기서 functional interface가 필요합니다. functional interface란 하나의 추상 메소드만을 가질 수 잇는 interface 입니다. @FunctionalInterface annotation을 이용하여 하나의 추상메소드만을 가지도록 강제 할 수 있습니다.

(찾아보니 abstract 메소드 제외하고 default 메소드와 static 메소드 여러개 가질 수 있음. java 1.8 버전부터)

 

람다식은 functional interface의 구현과 같음을 기억!

 

 

 

Example1

 

@FunctionalInterface
interface MyFunctionalInterface {
    
    void add(int a, int b);
}
public class LambdaTest1 {
  public static void main(String[] args) {
    // Lambda Expreassion 1
    MyFunctionalInterface f = (int a, int b) -> {
      System.out.println(a * b);
    };
    f.add(4, 5);// 20
    // Lambda Expreassion 2
    MyFunctionalInterface f2 = (a, b) -> System.out.println(a + b);
    f2.add(4, 5);// 9
  }
}

결과

20
9

 

 

Example2

자바의 스레드에 사용되는 Runnable 클래스는 대표적인 functional interface 입니다. 아래 예제에서 람다식이 Runnable 클래스 안에있는 run 메소드를 참조하고, Runnable클래스가 다시 Thread클래스를 참조하여 스레드를 실행시키는 것을 볼 수 있습니다.

 

public class LambdaTest1 {
  
  public static void main(String[] args) {
        new Thread(() -> {
            for(int i=0; i < 5; i++)
               System.out.println("Child Thread "+i);
        }).start();;
        
        for(int i=0; i < 5; i++) {
            System.out.println("Main Thread "+i);
        }
    }
}

결과

Main Thread 0
Main Thread 1
Main Thread 2
Main Thread 3
Main Thread 4
Child Thread 0
Child Thread 1
Child Thread 2
Child Thread 3
Child Thread 4

 

Example3

Predicate라는 builtin Functional interface를 이용한 예제입니다.

public class LambdaTest3 {
  
  public static void main(String[] args) {
        // Defining Lambda Expression for Predicate Functional interface
        Predicate<Integer> p = number -> (number % 2 == 0);
 
        System.out.println(p.test(10));//true
        System.out.println(p.test(11));//false
    }
}

 

참고로 람다식이 한줄이고 계산식인 경우 해당 값을 자동으로 return해 줍니다.

여러줄일경우, 람다식이 리턴값을 요구하는 경우 {} 안에 return값을 넣어주어야 합니다.

https://javagoal.com/return-type-of-lambda-expression/

 

Return Type of Lambda Expression and Lambda Expression Return

Let's see how to use return statement in lambda expression and return type of lambda expression. Different example with or without return.

javagoal.com

 

 

Example4

아래 예제는 foreach에 람다식을 사용한 예제입니다. foreach는 인풋으로 Consumer 객체를 받는데 이 또한 functional interface 입니다.

 

public class LambdaTest4 {
  
  public static void main(String[] args) {
    List<String> list = new ArrayList<>();
        list.add("Peter");
        list.add("Gerhard");
        list.add("Philip");
        list.add("John");
        
        list.forEach(value -> System.out.println(value));  
    }
}

결과

Peter
Gerhard
Philip
John
반응형

'Java > java상식' 카테고리의 다른 글

자바 ::(더블 콜론)의 의미  (0) 2021.07.07
final 클래스 final 메소드  (0) 2021.06.10
자바의 접근지시자 종류  (1) 2021.06.10
자바 점점점 의미  (0) 2021.06.01
[자바/java] 자바에서 public class와 class의 차이  (0) 2021.05.24

댓글