이론 정리/java

람다식이란??

철매존 2023. 1. 7. 01:41
728x90
반응형

람다식이란??

메소드를 하나의 식으로 표현한 것.
익명 함수(annonymous function)이라고도 한다.

이를 사용하면 기존의 함수를 간단하고 명확한 식으로 표현할 수 있게 된다.

함수형 언어

JDK1.8부터 함수형 언어의 기능을 java가 지원하기 시작했다.
그래서 java는 oop언어임과 동시에 함수형 언어의 기능을 포함하고 있다.

람다식이란??

1. 함수(메서드)를 간단한 식으로 표현하는 방법이다.

예를 들어

// 메서드
int max(int a, int b) {
    return a > b ? a : b;
}

요런 애를

// 람다식
(a, b) -> a > b ? a : b

이런 식으로 간단하게 표현하는 것이다.

2. 람다식은 익명 함수(anonymous function)이다.

위의 예시에서 볼 수 있듯 반환타입이름을 지운다.
그리고 화살표(->)를 통해 표현시킨다.

이렇게 표현하기 때문에 익명함수라고 한다.

람다식 작성하는 방법

1. 메서드의 이름, 반환타입 제거 후 ->를 블록 앞에 추가하기(익명함수로서)

int max(int a, int b) {
    return a > b ? a : b;
}

(int a, int b) -> {
    return a > b ? a : b;
}

이런 식으로 변경하는 것이다.

2. 반환값이 있는 경우, 식이나 값만 적고 return문 생략가능(끝에 ; 안붙임)

이렇게 하면 더 간단해진다.

(int a, int b) -> {
    return a > b ? a : b;
}

에서 추가로 return쪽을 생략해준다. (;도 생략)

(int a, int b) -> a > b ? a : b

이렇게 하면 더 간단해진다!!
참고로 이경우는 반환값이 있을때이다.

3. 매개변수의 타입이 추론 가능하면 생략가능(대부분 다 가능하다!)

(int a, int b) -> a > b ? a : b

여기서 남아있던 매개변수의 타입인 int형식은 추론 가능한 친구이기 때문에 생략이 가능하다.

(a, b) -> a > b ? a : b

요렇게.

람다식 작성의 주의사항

1. 매개변수가 하나일 경우 괄호 생략가능(타입이 없을때만)

(a) -> a * a

a -> a * a

로 변경 가능하다.

하지만

(int a) -> a * a

처럼 매개변수에 타입이 있는 경우는

int a -> a * a        // 불가능

이렇게 바꾸는게 불가능하다.
대부분 매개변수의 타입은 생략 가능한데, 이게 불가능한 경우가 있으므로 기억해 두어야 한다.

2. 블록 안의 문장이 하나뿐일때, 괄호 생략가능(끝에 ; 안붙임)

(int i) -> {
    System.out.println(i);
}

(int i) -> System.out.println(i)

로 생략 가능하다.

단, 하나뿐인 문장이 return문이면 괄호 생략 불가

(int a, int b) -> {return a > b ? a : b;} // OK

(int a, int b -> return a > b ? a : b // ERROR
-> 근데 어차피 return을 걍 생략한다.

람다식

  • 람다식은 익명 함수가 아니라 익명 객체이다.
    • 사실 자바에서는 메서드가 따로 존재할수가 없다... 그래서 익명 객체임.
      • 이런 익명 객체를 다루기 위한 참조변수가 필요하다.
반응형