Java/java

java :) lambda가 무엇이고 어떻게 사용하는가?, lambda를 사용하며 들었던 의문 (개념/사용법/의문)

euncheol kim 2022. 5. 19. 23:09

 

 

goal

java의 lambda를 이해한다.

 

1 ] 람다(Lambda)의 개념과 기본 사용법


  • java의 람다는 함수 지향 언어에 가깝다.
  • 람다식의 형태는 매개변수를 가진 코드 블록이지만, 런타임에 익명 구현 객체를 생성한다.
  • 메소드를 하나의 식으로 표현한 것을 의미한다.
  • 람다식은 익명 함수라고도 한다.

 

 

[1] 람다 사용의 이점


  • 코드가 매우 간결해짐
  • 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽계 집계

 

맛보기

  • 전형적인 익명 구현 객체의 생성
Runnable runnable = new Runnable() {
    public void run() {......}
}
  • 람다식으로 익명 구현 객체를 표현
Runnable runnable = () -> {...};

 

 

 

[2] 람다식의 기본 문법


  1. 기본 사용방법
//     1. (타입 매개변수,...) -> {실행문;}
(int a)->{System.out.println(a);}

 

  1. 매개변수가 한 개일 때의 좌측 식의 소괄호 생략
// 2. 매개변수가 한 개일 때 앞의 소괄호() 생략이 가능하다.
//        └ 매개변수 -> {실행문;}

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

 

  1. 실행문이 한 개일 경우 {실행문;}의 중괄호{ }도 생략이 가능하다.
a -> System.out.println(a);

 

  1. return값을 가지는 람다
(x + y) -> {return x + y;}

 

  1. 만약, 중괄호{실행문}안에 return만 가질 경우, return을 생략하고 쓰는 것이 일반적
(x + y) -> x + y

 

 

 

2 ] 람다 진짜 진짜 사용하기


많은 블로그를 보면 타켓 타입함수형 인터페이스 어쩌고 설명하고있다. 각설하고 바로 사용법을 기술해보겠다.

import java.util.function.IntConsumer;

@FunctionalInterface
interface test {
    void print1(int a, int b);
}

public class Note {
    public static void main(String[] args) {

        test T = (a, b) -> {
            System.out.printf("lambda처리 - printf1 추상메소드: %d", (a+b));
        };
        T.print1(2,3);

    }
}


/*
    -----output-----
    lambda처리 - printf1 추상메소드: 5
    ----------------
*/
  • 람다를 사용하기 위해서는 인터페이스를 선언해야하며,
    인터페이스 안에는 단 하나의 추상 메소드를 가져야한다.
  • 람다를 사용하는 구문은 아래와 같다.
test T = (a, b) -> { 
	System.out.printf("lambda처리 - printf1 추상메소드: %d", (a+b)); 
}; 

T.print1(2,3);

 

 

람다 사용의 주의 및 알아두면 괜찮을 것들

  • (주의점) : 람다를 사용하는 인터페이스 안에 두 개의 추상메소드를 가지면 오류가 난다.
  • (알아두기) :@FuntionalInterface가 없더라도 람다식을 구현해도 잘 작동한다. (메타 데이터 기술부라 생각)

 

 

 

람다를 사용하며 의문이 들었던 것

람다를 사용하는 인터페이스 안에 두 개의 메소드를 가지면 안될까?

정확하지는 않으나 Jaranun 께서의 첨언과 나의 생각을 더해 생각해보면 추상메소드가 두 개 이상이라면 아래 코드의 부분에서

test T = (a, b) -> {
    System.out.printf("lambda처리 - printf1 추상메소드: %d", (a+b));
};

객체가 생성되어질 때 컴파일러는 method-target이 어떤 것인지 정확하게 모른다.

러한 이유로 람다식을 사용하는 인터페이스에서는 하나의 추상메소드만 가져야한다.