[인프런워밍업클럽][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);
});
}
참고자료
댓글을 작성해보세요.