
람다식은 Java 8부터 함수형 프로그래밍이 등장하면서 이를 지원하는 주요 패러다임으로 등장한 문법이다. 기존 익명 클래스를 사용하는 코드를 간결하게 만들어준다.
기존 Java 8 이전에서는 인터페이스를 사용하여 정말 간단한 코드를 추가한다고 해도 작성해야하는 줄이 늘어날 수 있고, 가독성도 떨어졌었다.


혹은
public class Submit{
public static void main(String[] args) {
Assignment submit = new Assignment() {
@Override
public void submit(){
System.out.println("제출");
}
};
submit.submit();
}
}
이렇게 익명 클래스를 사용해야 했는데, 이런 구조들은 "제출"을 println 하기 위해 코드가 길어질 수 밖에 없었다.
하지만, Java 8부터는 인터페이스에 @FunctionalInterface 어노테이션을 붙여 람다로 사용할 수 있게 만들어 이를 간소화했다.
public class Submit{
public static void main(String[] args) {
Assignment submit = () ->
System.out.println("제출");
submit.submit();
}
}
인터페이스에 어노테이션을 붙이면 그 인터페이스는 추상 메소드를 하나만 가질 수 있게 되고, 람다는 이러한 이유로 메소드 이름이 없어도 메소드를 정의할 수 있게 되는 것이다.
그렇다면, 메소드 하나 때문에 인터페이스를 만들어야 하는가? 에 대해서는 Java에서 제공하는 함수형 인터페이스 F, T 등을 사용하면 이 문제를 해결할 수 있다.
함수형 인터페이스 내용
https://bcp0109.tistory.com/313
1번에서 서술한 내용에 의하면 익명 클래스로 정의된 내용을 람다식을 이용하여 간소화할 수 있었다. 익명 클래스는 이름 없이 클래스를 정의하고 객체를 생성했다면, 람다는 클래스를 정의할 필요없이 메소드의 행동만을 표현한다.
우리가 배운 코드에서 이를 알아보자.
@GetMapping("/user")
public List<UserResponse> getUsers(){
String sql = "select * from user";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
long id = rs.getLong("id");
String name = rs.getString("name");
int age = rs.getInt("age");
return new UserResponse(id, name, age);
});
// return jdbcTemplate.query(sql, new RowMapper<UserResponse>() {
// @Override
// public UserResponse mapRow(ResultSet rs, int rowNum) throws SQLException {
// long id = rs.getLong("id");
// String name = rs.getString("name");
// int age = rs.getInt("age");
// return new UserResponse(id, name, age);
// }
// });
}
UserController에서 GET 요청을 받을 때 주석처리된 부분에서 익명클래스가 사용되었고, 이를 람다 문법을 사용하여 간소화하였다. 코드를 자세히 보면 RowMapper의 mapRow 메소드를 람다로 간소화되었다. 이 RowMapper 코드를 보면

@FunctionalInterface 어노테이션을 확인할 수 있고, 함수형 인터페이스가 사용되었음을 알 수 있다. RowMapper 인터페이스에 mapRow라는 메소드가 하나만 존재했기 때문에 람다로 이 추상메소드를 구현할 수 있었던 것이다.
기본 문법은 다음과 같다.
(parameters) -> { body }