본문 바로가기
Back-End/Java

TIL 230711 : 자바의 람다식 짚고 넘어가기.

by 우인입니다 2023. 7. 12.

조금은 머쓱한 얘기지만 자바의 기본 문법을 배울 때 잘 이해되지 않고 다른 것들에 밀려 유보해두었던 람다와 스트림에 대해 다시 한 번 공부를 해서 개념을 짚고 넘어가보려 합니다.

 


강의를 들으며 이해가 안 됐던 코드 두가지가 있다.

 

Product product = productRepository.findById(id).orElseThrow(()->
                new NullPointerException("해당 상품은 존재하지 않습니다.")
                );
Page<ProductResponseDto> responseDtoList = products.map(ProductResponseDto::new);

 

바로, 람다식 그리고 메서드 참조이다.

 


 

람다식

람다식은 우선 코드를 간편하게 해주기 위해 태어난 것이다.

반대로 말하면 위의 람다식을 이용한 코드를 람다식이 없을 때 어떻게 표현해야 할 지를 역으로 추적하며 공부해본다.

 

뒤에 "라고 할뻔"을 붙여주는 almost메소드가 있습니다.

printLn메소드안에 almost메소드를 통한 String값을 넣어주려고 합니다.

 

출력해보면 위처럼 나오게 됩니다.

 

만약 almost메소드가 저기서 한번쓰이기 위해서 굳이 저렇게 almost를 새롭게 만들어 줬다고 생각해봅니다.

이 때, 쓰이는 것이 람다식 입니다.

 

함수형 인터페이스

람다식을 쓰기 이전에 함수형 인터페이스에 대해 알아야 합니다.

왜냐하면, 람다식은 자바에서 함수형 인터페이스에서만 작동이 되는 제한이 걸려있습니다.

엄밀히 말하자면, 익명 객체를 다뤄줄 함수형 인터페이스가 필요한 셈입니다.

 

함수형 인터페이스란? 

쉽게 말해 메소드가 하나인 인터페이스입니다.

처음에 메소드로 만들어 줬던 Almost를 인터페이스 내에서 다시 선언해줬습니다.

 

 

그리고 이 인터페이스를 객체로 생성할 수 있습니다.

그런 뒤 실행해주면?

똑같이 실행이 되는 것을 알 수 있습니다.

 

 

람다식으로 바꿔보기

인텔리제이에서도 이미 해당 익명 클래스의 객체를 람다로 대체할 수 있다고 알려주고 있다.

 

이렇듯 람다식은 엄밀히 따지면 익명 메소드인 셈이다.

 

람다로 변환하게 되면 위와 같이 한 줄로 바뀌게 된다.

 

익명 객체에 있는 메소드가 하나다 보니 거기에 자동으로 람다식이 대체해주는 그런 느낌??

 

 

java.util.function 패키지

자바에서 자주 쓰이는 함수형 인터페이스들은 'java.util.function' 패키지에 미리 정의되어 있다.

여기에 없는 인터페이스인 경우에 정의해서 사용하는 것이 좋다.

 

출처(https://hbase.tistory.com/78)

 


아직 확실하게 와닿지가 않습니다.

다시 모던자바에 대한 시간을 좀 더 투자해서 보완하도록 해보는 것으로 마무리 해봅니다.