Java 공부/Java 일반

람다식 (Lamda Expression)

모항 2022. 7. 28. 18:06

스프링 기초 공부를 하던 중, 강사님의 예시 코드에 람다식이 자주 등장해서 찾아보게 되었다.

일단 스프링 공부를 별 문제 없이 해나갈 수 있을 정도로만 람다식에 대해 살펴보고

내가 스스로 알아들을 수 있으며 앞으로 잊지 않는 데 도움이 될 정도로만 간단하게 정리해보기로 했다.

 

 

 

람다식 만드는 법

 

함수를 람다식으로 고쳐쓸 때의 규칙은 다음과 같다.

  1. 함수의 리턴 타입과 함수명을 지운다.
  2. 매개변수들의 타입을 명시하지 않아도 알 수 있는 상황이라면 매개변수들의 타입을 생략할 수 있다. (코드를 짜다 보면 맥락상 알 수 있는 경우가 대부분이기 때문에 웬만하면 생략한다)
  3. 매개변수가 하나뿐이고 타입을 생략하였다면 ( ) 를 생략할 수 있다. 타입을 생략하지 않았다면 ( ) 는 지울 수 없다는 점에 주의하자.
  4. 매개변수가 없는 경우에는 텅 빈 ( ) 를 써주어야 한다. ( ) 를 지울 수 없다.
  5. 함수 내에 문장이 하나밖에 없다면 { } 를 지울 수 있다. 단, 그 하나밖에 없는 문장이 return 문이라면 { } 를 지울 수 없다. 문장에서 "return"을 생략한다면 { } 를 지울 수 있다.
  6. { } 를 지우지 않은 상태라면 { } 안의 문장들에는 세미콜론이 붙는다. { } 를 지워서 문장 하나의 형태가 되었다면, 본능적으로 세미콜론이 있어야 할 것 같은 기분이 들겠지만 세미콜론을 반드시 지워야 한다.

 

다음과 같은 일반적인 함수가 있다.

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와 어떻게 맞물려 돌아가는지도 아직 잘 모르겠다.

 

하지만 일단 코드의 진행에 대해서는 이해가 되었으니 스프링 공부부터 계속 해봐야겠다. 람다식에 대해 더 알아보고 정리할 내용이 생기면  이 게시글로 돌아와서 추가하겠다.

 

아래는 람다식에 대해 알아보게 만든 스프링 강의의 노트정리 게시글이다.

 

회원 관리 예제 - 백엔드 개발: 회원 서비스 개발

컨트롤러, 서비스, 도메인, 리포지토리, DB 중에서 컨트롤러, 도메인, 리포지토리를 지금까지 배웠다. 오늘은 서비스를 만들어보는 실습이다. 리포지토리와 서비스의 차이점 리포지토리를 만들

blowupmomo.tistory.com