람다식01 (Lambda Expression)
1. 람다식01
- 람다식의 도입으로 인해 자바는 객체지향언어인 동시에 함수형 언어가 되었다.
1.1 람다식이란?
- 메서드를 하나의 식으로 표현한 것
- 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 람다식을 익명 함수라고도 한다.
- 람다식은 오직 람다식 자체만으로 메서드의 역할을 대신한다.
- 멤서드의 매개변수로 전달되어 지는 것이 간으하고, 메서드의 결과로 반환될 수도 있다.
- 람다식으로 인해 메서드를 변수처럼 다루는 것이 가능해졌다.
메서드와 함수의 차이
- 멤서드는 함수와 같은 의미이지만, 특정 클래스에 반드시 속해야 한다는 제약이 있기 때문에 기존의 함수와 같읜 의미의 다른 용어를 선택해서 사용한 것이다.
- 람다식을 통해 메서드가 하나의 독립적인 기능을 하기 때문에 함수라는 용어를 사용하게 되었다.
1.2 람다식 작성하기
- 이름과 반환 타입을 제거하고 매개변수 선언부와 몸통{} 사이에 -> 를 추가한다.
// 람다식 적용 전
반환타입 메서드이름(매개변수 선언) {
문장들
}
// 람다식 적용 후
(매개변수 선언) -> {
문장들
}
- 예시
// 두 값 중에서 큰 값을 반환하는 메서드
// 람다 적용 전
int max(int a, int b) {
return a > b ? a : b;
}
// 람다 적용 후
(int a, int b) -> {
return a > b ? a : b;
}
- 반환 값이 있는 메서드의 경우, return 문 대신 식으로 대신할 수 있다.
- 식의 연산결과가 자동적으로 반환값이 된다.
- 이때는 문장이 아닌 식이므로 끝에 ;를 붙이지 않는다.
// return 문
(int a, int b) -> { return a > b ? a : b; }
// 식
(int a, int b) -> a > b ? a : b
- 람다식에 선언된 매개 변수의 타입은 추론이 가능한 경우는 생략할 수 있다.
- 반환 타입이 없는 이유도 추론이 가능하기 때문이다.
// 반환 타입 유
(int a, int b) -> a > b ? a : b
// 반환 타입 무
(a, b) -> a > b ? a : b
- 선언된 매개 변수가 하나뿐일 경우에는 괄호를 생략할 수 있다.
- 단, 매개변수 타입이 있으면 생략할 수 없다.
// 괄호 생략 전
(a) -> a * a
// 괄호 생략 후
a -> a * a
- 괄호{} 안의 문장이 하나일 때는 괄호를 생략할 수 있다.
-
문장 끝에 ;을 붙이지 않아야 하는 것에 주의하자
- 괄호 안의 문장이 return 문일때는 괄호{}를 생략할 수 없다.
// 괄호{} 생략 전
(String name, int i) -> {
System.out.println(name+"="+i);
}
// 괄호{} 생략 후
(String name, int i) ->
System.out.println(name+"="+i)