Spring

인프런 워밍업클럽 3일차 과제

jmboy 2024. 2. 22. 13:07

우리는 JdbcTemplate을 사용하는 과정에서 익명 클래스와 람다식이라는 자바 문법을 사용했습니다. 익명 클래스는 자바의 초창기부터 있던 기능이고, 람다식은 자바 8에서 등장한 기능입니다. 다음 키워드를 사용해 몇 가지 블로그 글을 찾아보세요! 아래 질문을 생각하며 공부해보면 좋습니다! 😊

 

[키워드]

익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스

[질문]

  • 자바의 람다식은 왜 등장했을까?
  • 람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?

 

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

  • 람다식은 메서드를 하나의 식으로 표현한것! 
  • 메서드의 이름과 반환값이 없어지므로 익명함수라고도 불린다. 
  • 람다식으로 메서드를 변수처럼 다루는것이 가능해졌다!

2. 람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?

  • 람다식은 메서드에서 이름과 반환 타입을 제거하고 매개변수 선언부와 몸통 {} 사이에 -> 를 추가한다!
  • https://gmini.tistory.com/5
 

Lambda란 무엇일까?

1.1 람다식이란? 메서드를 하나의 식으로 표현한 것이다. 함수를 간략하면서도, 명확한 식으로 표현할 수 있게 해준다. 함수형 언어의 특징을 가지고 있다. int[] arr = new int[5]; Arrays.setAll(arr,(i)->(int

gmini.tistory.com

함수형 프로그래밍인 함수형 인터페이스와 1:1로 매핑 시켜준다고 생각하자! 

  • 함수형 인터페이스는 @FunctionalInterface 의 어노테이션을 붙여주면 해당 인터페이스가 함수형 인터페이스가 맞는지 확인해준다!
    • 함수형 인터페이스 : 추상메서드가 1개밖에 존재하지 않는 인터페이스이다.
  • 해당 함수형 인터페이스를 간추려서 작성한 식이 람다식이라고 이해하였다!
  • 우리가 작성했던 API 중 람다식을 사용한 부분이 있는데 확인해보자!
    @DeleteMapping("/user")
    public void deleteUser(@RequestParam String name) {
        String readSql = "Select * from user where name = ?";
        boolean isUserNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty(); // rowMapper 를 람다로 받음 -> rowMapper 는 ResultSet 을 받아서 원하는 객체로 변환해주는 역할을 한다.
        if (isUserNotExist) {
            throw new IllegalArgumentException();
        }
        String sql = "Delete from user where name = ?";
        jdbcTemplate.update(sql, name);
    }

해당 메서드에서 query (readsql , (rs,rowNum)->0,name) 부분에 람다가 쓰인것을 확인해 볼 수 있다. 해당 query 함수를 타고 들어가 보았다. 

//JdbcTemplate class / query method
public <T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException {
        return (List)result(this.query((String)sql, (Object[])args, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper))));
    }

해당 query 함수에서 RowMapper 함수형 인터페이스를 매개변수로 사용하고 있음을 확인할 수 있다. 

// RowMapper.Class

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.jdbc.core;

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.lang.Nullable;

@FunctionalInterface
public interface RowMapper<T> {
    @Nullable
    T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
  • 해당 RowMapper 인터페이스가 함수형 인터페이스로 작성되어있음을 알 수 있다!!