[인프런워밍업클럽][BE] 과제 3 | Lambda 식

1. 람다식(Lambda Expression) 이란?

: 익명함수를 생성하기 위한 식 (Annoymous Function, 익명함수)

1.1 람다식의 등장 배경

- 복잡한 요구사항을 처리하기 위해 기존 Java 문법으로는 Method 사용이 늘어나는 등 코드의 복잡도가 높아짐

- 메소드의 제한적 사용

- 객체를 통한 접근만을 허용

- 메소드 자체를 변수로 사용 불가

1.2 람다식 특징

- 익명 함수 : 식별자없이 실행가능한 함수 (메소드명이 없음)

- 간결한 문법

- 함수형 인터페이스 지원

1.3 람다식의 장/단점

(1) 장점

- 코드의 간결성 : 불필요한 반복문의 삭제 가능

- 지연연산 수행 : 불필요한 연산 최소화

- 병렬처리 기능 : 멀티쓰레드 활용

- 가독성 향상 : 코드가 실제로 수행하고자 하는 로직이 추상적으로 드러남

(2) 단점

- 호출을 위해 직접 메소드를 불러야 함 : 람다식 생성 및 전달이 간결한 것과는 달리, 람다식 실행 시 인터페이스에 선언된 메소드 호출이 필요

- 재귀 람다식 호출의 어려움

 

2. 람다식의 사용

2.1 람다식 기본

  • 기본 형태 : 인터페이스 객체 변수명 = (매개변수, ..., 매개변수) -> {함수몸체;}

  • 구성요소

    • 매개변수 : 메소드 매개변수(parameter)

      • 하나일 경우 매개변수 또는 매개변수를 감싸는 () 생략 가능 (둘 다 생략은 안됨)

    • 화살표 : 코드 블럭을 실행(호출)

    • 메소드 구현부 (함수몸체) : {}

      • 함수몸체가 단일 실행문이면 {} 생략 가능

      • 단, 함수몸체가 return 문으로만 구성되어 있으면 {} 생략 불가

 

2.2 람다식 예제

(추가 필요)

 

2.3 람다식 해석

(1) 13강. GET API 람다 식 적용 전

  • RowMapper = PreparedStatement + ResultSet

    • JdbcTemplate.query()와 연동하여 사용

    • SQL문의 결과값 각 행을 원하는 자료형으로 변환 : 즉, 각 행의 각 열(column)과 java 코드의 변수를 매핑시켜 줌.

  • 아래 코드에서 함수의 흐름은 다음과 같다

    • 각각 다음의 형식으로 매핑시킴

      • long id : id bigint

      • String name : name varchar(20)

      • int age : age int

    • return 시에는 method에서 반환값을 List<UserResponse>로 정의했으므로 UserResponse 생성자를 이용하여 구성

       

@GetMapping("/user")
public List<UserResponse> getUsers(){
    //1. SQL 조회
    String sql = "SELECT * FROM users";
    //2. JDBC 연결, 처리
    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);
        }
    });
}

 

(2) 13강. GET API 람다 식 적용 후

  • 람다식 적용전에 비해 짧아졌으며, 중요한 부분 (매핑되는 부분)이 강조되어 보임.

  • 람다식

    • 매개변수 : rs (=ResultSet), rowNum

    • 함수본체 : 각각 java 변수와 sql 결과를 매핑시킴

  • 그러나 여전히 rs = ResultSet 이고, RowMapper 인스턴스를 사용한다는 걸 어떻게 인지하는 건지 모르겠음.

     

@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);
    });
}

 


참고자료

댓글을 작성해보세요.