Free Lines Arrow
본문 바로가기
Language/Java

[Java] Lambda

by skahn1215 2021. 8. 6.
728x90
반응형

Lambda란?

  • 람다는 람다 대수(lambda calculus)에서 유래한다.
  • 람다 대수에서 람다식(lambda expression)은 수학의 함수를 단순하게 표현하는 방법이다.
  • 이름 없는 함수(익명함수), 람다식(lambda expression) 혹은 람다 함수(lambda function)로 불린다. 

 

 

 

 

Lambda 구조

 

 

 

매개변수 리스트

  • 매개변수 리스트에는 함수에 전달되는 매개변수들이 나열된다. 
  • 매개변수를 생략하면 컴파일러가 추론 기능을 이용하여 알아서 처리한다.
  • 매개변수가 하나인 경우 괄호를 생략할 수 있다

 

 

애로우 토큰(->)

  • 애로우 토큰은 매개변수 리스트와 함수 코드를 분리시키는 역할이다. 
  • 매개변수들을 전달하여 함수 바디 { }에 작성된 코드를 실행한다는 의미로 알아두면 된다.

 

 

 

함수 바디

  • 함수 바디는 함수의 코드이다. 
  • 중괄호({ })로 둘러싸는 일반적이지만, 한 문장인 경우 중괄호({ })를 생략해도 된다. 
  • 문장이더라도 return 문이 있으면 반드시 중괄호로 둘러싸야 한다. 

 

 

 

 

Lambda작성법

 

기본작성

(int id) -> { System.out.println("ID는 " + id); }

 

 

타입생략

  • 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할수 있다.
  • (id) -> { System.out.println("ID는 " + id); }

 

 

 

괄호생략

  • 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.
  • id -> System.out.println("ID는 " + id); // ()와 {} 생략

 

 

중괄호생략1

  • 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다.
    - (이때 세미콜론(;)은 붙이지 않음)
  • (String name) -> name.length()

 

 

 

중괄호생략2

  • 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.
  • (x, y) -> { return x + y; } // 합을 리턴하는 람다식

 

 

표현식으로 가능한 경우

  • (x, y) -> x + y; // return 생략 가능. x+y의 합을 리턴하는 람다식

 

 

 

Lambda 구현하기

람다식은 함수형 인터페이스에 선언된 추상 메소드를 구현하는 방식이다.

 

 

1. 함수형 인터페이스 작성

함수형 인터페이스는 추상메소드 하나만 있는 인터페이스이다.

 

매개변수 0개
interface LambdaEx0 { // 함수형 인터페이스
    void print() // 추상 메소드
}

매개변수 1개
interface LambdaEx1 {
    int calc(int x);
}


매개변수 2개
interface LambdaEx2 {
    int calc(int x, int y);
}

추상메소드를 람다식으로 구현
(x ,y) -> {return x+y; } = > int calc(int x, int y) { return x+y; }

 

 

 

 

2. 추상메소드를 람다식으로 구현

(x ,y) -> {return x+y; } = > int calc(int x, int y) { return x+y; }

 

 

 

 

3. 람다식 변수에 치환

square:
LambdaEx1 square= (x) - >x*x;

add:
LambdaEx2 add = (x, y) - >{return x+y; };

minus:
LambdaEx2 minus = (x, y) - >{return x-y; };

 

 

 

4. 람다식 호출

System.out.println(square.calc(2));
System.out.println(add.calc(2,3));
System.out.println(minus.calc(2,3));

 

 

 

5.람다식 매개변수로 넘기기

static void printMultiply(int x, int y, lamdaFunction4 f) { // f로 (x,y)->x*y람다식 전달받음
     System.out.println(f.calc(x, y));
}

printMultiply(3, 4, (x,y)->x/y); // 람다식((x,y)->x*y)을 매개변수로 전달

 

 

 

 

 

@FunctionalInterface 사용하여 컴파일 에러 막기

@FunctionalInterface의 사용은 컴파일러에게 인터페이스가 추상 메소드가 1개만 있는 함수형 인
터페이스인지 확인하도록 하여, 처음부터 잘못된 인터페이스 작성을 막는 장점이 있다. 

 

//정상동작

@FunctionalInterface
    interface Lamda {
    int calc(int x, int y);
}

 

// 컴파일에러발생

// 추상 함수가 2개임.
@FunctionalInterface
    interface Lamda { // 이 라인에 컴파일 오류 발생
    int calc(int x, int y);
    void print();
}

 

 

 

 

재네릭 함수형 인터페이스

@FunctionalInterface
interface MyFunction<T> { // 제네릭 타입 T를 가진 함수형 인터페이스
    void print(T x); // 람다식으로 구현할 추상 메소드
}

MyFunction<String> f1 = (x) -> System.out.println(x.toString());
f1.print("ABC"); // String 객체를 람다식에 넘겨준다.

MyFunction<Integer> f2 = (x) -> System.out.println(x.toString());
f2.print(Integer.valueOf(100)); // Integer 객체를 람다식에 넘겨준다.

 

 

 

구현코드


public class LambdaTest {

    interface LambdaEx1 {
        int calc(int x);
    }

    interface LambdaEx2 {
        int calc(int x, int y);
    }

    @FunctionalInterface
    interface LambdaEx3<T> {
        void print(T x);
    }

    public static void printDivide(int x, int y, LambdaEx2 f) {
        System.out.println(f.calc(x, y));
    }

    public static void main(String[] args) {
        LambdaEx1 square = (x) -> x*x;
        LambdaEx2 add = (x,y) -> { return x+y; };
        LambdaEx2 minus = (x,y) -> { return x-y; };

        System.out.println(square.calc(2));
        System.out.println(add.calc(2,3));
        System.out.println(minus.calc(2,3));
        printDivide(6,3, (x,y)->x/y);


        LambdaEx3<String> stringLambda = (x) -> System.out.println(x.toString());
        stringLambda.print("ABC");

        LambdaEx3<Integer> intLambda = (x) -> System.out.println(x);
        intLambda.print(Integer.valueOf(100));


        
    }
}

 



 

 

 

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] Annotation  (0) 2021.08.20
[Java] Collection Framework  (0) 2021.08.20
[Java] Sort  (0) 2021.05.29
[Java] ArrayList to String[]  (0) 2021.05.23
[Java] ArrayList  (0) 2021.05.10

댓글