인프런워밍업스터디_BE_3일차_과제

오현석·2024년 2월 20일

3일차 과제

1. 자바의 람다식은 왜 등장했을까?

람다식은 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

2. 람다식과 익명 클래스는 어떤 관계가 있을까?

1번에서 서술한 내용에 의하면 익명 클래스로 정의된 내용을 람다식을 이용하여 간소화할 수 있었다. 익명 클래스는 이름 없이 클래스를 정의하고 객체를 생성했다면, 람다는 클래스를 정의할 필요없이 메소드의 행동만을 표현한다.
우리가 배운 코드에서 이를 알아보자.

JdbcTemplate을 사용할 때 익명클래스와 람다가 사용된 부분.

@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라는 메소드가 하나만 존재했기 때문에 람다로 이 추상메소드를 구현할 수 있었던 것이다.

2.1 람다식의 문법은 어떻게 될까?

기본 문법은 다음과 같다.

(parameters) -> { body }
  1. Parameters : 매개변수를 작성하는 곳이다. 일반적으로 매개변수의 타입은 컴파일러가 추론할 수 있으므로 매개변수명만 적는다. 매개변수가 없거나 2개 이상인 경우는 ()를 사용하며, 하나인 경우는 괄호를 생략할 수 있다.
  2. Body : 람다식의 본문을 나타낸다. 본문이 한 줄인 경우 중괄호{}를 생략할 수 있으며, 이때 본문의 결과가 람다식의 결과로 반환된다. 본문이 여러 줄인 경우 중괄호를 사용하고, return 문을 사용하여 결과를 반환해야 한다.
profile
다함께 성장하는 개발자 세상을 꿈꾸는 MLOps 엔지니어입니다😁 작성 당시 제 생각의 흐름을 독자 모두가 공감하고 이해할 수 있게 적으려고 노력합니다. 조언이나 질문은 언제든 환영입니다!

0개의 댓글