[Java] 람다식(lambda expression)

Minjun Kang·2022년 12월 27일
0

basic-java

목록 보기
2/5

람다식?

메소드와 유사하며 인라인으로 구현이 가능하다. 또한 일급 객체로 취급할 수 있게 만든다.
함수형 인터페이스를 구현하기 위한 방법 중 하나.

특징

  • Java에서 Lambda expression은 항상 순수 함수(Pure Function)이어야한다.
    이러한 이유로, 람다식은 자신을 선언한 클래스의 final 또는 Effective final 만 참조 가능하다. (Capturing)
    ‼️Effective finalfinal로 선언되지 않는 변수가 불변하다는 것.

    순수함수 = 수학적 함수. f(x) = y라면, 어느 시점에서나 f(x) = y라는 값을 보장해야한다.

  • 람다식은 자신을 선언한 클래스와 동일한 Scope에 존재한다.
    클래스와 다르게 람다는 동일한 스코프에 존재하기 때문에, 자신을 선언한 클래스의 지역 변수와 동일한 이름을 가진 변수를 선언할 수 없다.

문법

  • 기본 형식
    (Ta){bodystatement}(T\:a) \rightarrow \{ body \: statement\}
    T는 인자 값의 타입을 의미한다. body statement는 해당 람다식이 수행하는 행위를 기술한다.

  • 타입 추론에 의한 축약 형태
    아래와 같이 제너릭으로 정의된 함수형 인터페이스를 통해서 타입 유추가 가능한 경우, 람다식의 인자 타입을 생략할 수 있다.
	Function<Integer, Integer> fn = (a) -> {return a + 10;};

이러한 타입 추론은 제너릭의 타입 정보가 컴파일 타임에 소거되는 것에 기인한다.


  • body statement가 단일 구문이라면 {} 를 생략할 수 있다.
	Consumer<Integer> consumer = (a) -> System.out.println("hello" + a);

  • body statement가 단일 리턴 구문이라면 return 또한 생략할 수 있다.
	Function<Integer, Integer> fn = (a) -> a + 10;

  • 람다식의 입력 인자가 1개일 경우 () 를 생략할 수 있다. 단 이 경우, 인자 타입을 생략 해야한다
	Function<Integer, Integer> fn = a -> a + 10;

메소드 레퍼런스

참고

  • Lambda Expression의 일종
  • 기존에 존재하는 메소드를 람다 형식으로 참조하는 것
  • 메소드를 간접 호출하기 위해 사용한다. (실행 중 유연하게 행위를 변경할 수 있다!)
  1. Static method 참조
    타입::staticmethod\: 타입:: static \: method
  2. Instance method 참조
    객체레퍼런스::instancemethod\: 객체 \: 레퍼런스:: instance \: method
  3. 임의 객체의 Instance method 참조
    타입::instancemethod\: 타입:: instance \: method
  4. Constructor 참조
    타입::new\: 타입:: new
profile
성장하는 개발자

0개의 댓글