Lamda Expression

joonan·2024년 10월 30일

java

목록 보기
6/6

람다식이란?

람다식은 메서드를 하나의 식으로 표현한 것입니다. 메서드를 람다식으로 표현하게 될 경우 메서드의 이름과 반환값이 없어지므로 람다식을 익명 함수 라고도 부릅니다.

int[] arr = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random() * 5 + 1));

위 코드에서 () -> (int)(Math.random() * 5 + 1) 가 바로 람다식 입니다. 해당 람다식을 메서드로 바꾸면 다음과 같이 됩니다.

int method() {
	return (int)(Math.random() * 5 + 1)
}

모든 메서드는 클래스 내부에 있어야 합니다. 따라서 클래스를 만들고 객체또한 생성 해야지 인스턴스 메서드를 사용할 수 있습니다. 하지만 람다식은 이러한 과정 없이 오직 람다식 자체만으로도 이 메서드의 역할을 대신할 수 있습니다. 또한 람다식은 메서드의 매개변수로 전달 가능하며 반환값으로도 사용될 수 있습니다. 즉 람다식으로 인해 메서드를 변수처럼 다룰 수 있게 되는 것입니다.

람다식 작성법

람다식은 메서드에서 메서드 이름과 반환 타입을 제거하고 매개변수 선언부와 몸통 {} 사이에 를 추가하면 됩니다.

즉 다음 메서드를

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

이렇게 바꾸면 람다식이 완성 됩니다.

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

반환 값이 존재하는 메서드일 경우 return 문 대신 으로 대체할 수 있습니다. 식으로 표현하게 될 경우 식의 연산 결과가 자동으로 반환값이 됩니다.

(int a, int b) ->  a > b ? a : b // 문장이 아닌 식이므로 끝에 ; 를 붙이지 않는다.

람다식에 선언된 매개 변수의 타입은 추론이 가능한 경우 생략할 수 있습니다. 대부분의 경우 생략이 가능합니다. 람다식에 반환 타입이 없는 이유도 항상 추론이 가능하기 때문입니다. 물론 생략할때 매개변수의 타입을 모두 생략해야 합니다.

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

다음과 같이 선언된 매개변수가 하나일 경우 () 를 생략할 수 있습니다. 단 매개변수에 타입이 존재할 경우 () 를 생략할 수 없습니다.

a -> a * a
(int a) -> a * a

마찬가지로 {} 안의 문장이 하나일 경우 {} 를 생략할 수 있습니다. 이때 문장의 끝에 ; 을 붙이지 않아야 합니다.

(String name, int i) -> System.out.println(name + " : " + i);

그러나 {} 안의 문장이 return 문일 경우 {} 를 생략할 수 없습니다.

정리

위 내용을 요약하면 다음과 같습니다.

  • 기존 메서드에서 메서드 명과 반환 타입 제거
  • 매개변수 선언부와 함수 몸통 사이애 추가
  • return 문이 존재할 경우 문장 대신 식으로 표현가능. 단 ; 은 붙이지 않음
  • 매개변수 타입이 추론 가능한 경우 타입 생략 가능. 단 생략할 거면 모든 매개변수 타입 생략
  • 매개변수가 하나일 경우 () 생략가능. 단 매개변수 타입이 있을 경우 생략 불가
  • {} 내부에 문장이 하나일 경우 {} 생략 가능. 단 ; 은 붙이지 않음
profile
끄적 끄적

0개의 댓글