스프링 기초 공부를 하던 중, 강사님의 예시 코드에 람다식이 자주 등장해서 찾아보게 되었다.
일단 스프링 공부를 별 문제 없이 해나갈 수 있을 정도로만 람다식에 대해 살펴보고
내가 스스로 알아들을 수 있으며 앞으로 잊지 않는 데 도움이 될 정도로만 간단하게 정리해보기로 했다.
람다식 만드는 법
함수를 람다식으로 고쳐쓸 때의 규칙은 다음과 같다.
- 함수의 리턴 타입과 함수명을 지운다.
- 매개변수들의 타입을 명시하지 않아도 알 수 있는 상황이라면 매개변수들의 타입을 생략할 수 있다. (코드를 짜다 보면 맥락상 알 수 있는 경우가 대부분이기 때문에 웬만하면 생략한다)
- 매개변수가 하나뿐이고 타입을 생략하였다면 ( ) 를 생략할 수 있다. 타입을 생략하지 않았다면 ( ) 는 지울 수 없다는 점에 주의하자.
- 매개변수가 없는 경우에는 텅 빈 ( ) 를 써주어야 한다. ( ) 를 지울 수 없다.
- 함수 내에 문장이 하나밖에 없다면 { } 를 지울 수 있다. 단, 그 하나밖에 없는 문장이 return 문이라면 { } 를 지울 수 없다. 문장에서 "return"을 생략한다면 { } 를 지울 수 있다.
- { } 를 지우지 않은 상태라면 { } 안의 문장들에는 세미콜론이 붙는다. { } 를 지워서 문장 하나의 형태가 되었다면, 본능적으로 세미콜론이 있어야 할 것 같은 기분이 들겠지만 세미콜론을 반드시 지워야 한다.
다음과 같은 일반적인 함수가 있다.
int max(int a, int b){
return a>b ? a : b;
}
a 와 b 중 더 큰 정수를 리턴하는 함수이다.
이 식을 람다식으로 고쳐보면
리턴 타입인 int를 지웠다.
함수명인 max를 지웠다.
매개변수들의 타입인 int들을 지웠다. 매개변수가 두 개이므로 ( ) 는 지우지 않았다.
들어있는 문장이 return문 하나이다. 따라서 return을 생략하고 { } 를 지웠다.
세미콜론을 지웠다.
(a, b) -> a>b ? a : b
이렇게 된다.
이제 스프링 공부 중에 보았던 식을 살펴봐야겠다.
문제의 그 코드...
private void duplicatedNameCheck(Member member) {
//이름 중복 검사하기
memberRepository.findByName(member.getName()).ifPresent(m ->
{
throw new IllegalStateException("이미 존재하는 이름입니다.");
});
}
람다식만 떼어놓으면 다음과 같다.
m ->
{
throw new IllegalStateException("이미 존재하는 이름입니다.");
}
여기서 m은 Member 객체이다. Member일 것이라는 사실을 맥락상 알 수 있으므로 Member가 생략되었다.
그럼 이 람다식은 Member 객체를 인풋으로 받은 뒤 예외를 throw하는 함수이다.
예외를 throw하는 것 뿐인데 왜 Member 객체가 인풋으로 필요한지는 예외가 던져지는 과정에 대해 더 찾아봐야 알 수 있을 것 같고,
ifPresent와 어떻게 맞물려 돌아가는지도 아직 잘 모르겠다.
하지만 일단 코드의 진행에 대해서는 이해가 되었으니 스프링 공부부터 계속 해봐야겠다. 람다식에 대해 더 알아보고 정리할 내용이 생기면 이 게시글로 돌아와서 추가하겠다.
아래는 람다식에 대해 알아보게 만든 스프링 강의의 노트정리 게시글이다.
'Java 공부 > Java 일반' 카테고리의 다른 글
입력값의 제공 횟수가 정해져있지 않을 때의 해결법 (백준 기준) (0) | 2023.09.05 |
---|---|
Class로 클래스의 정보 얻어오기 (리플렉션) (0) | 2022.08.08 |
자바에서 1차원 배열을 활용한 우선순위 큐 구현하기 (0) | 2022.07.19 |
자바에서 문자열의 형식을 설정하기 : String.format() (0) | 2022.03.29 |
String을 char[]로 바꾸어주는 toCharArray() (0) | 2022.02.22 |