Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240706 드디어 람다를 이해할 수 있나..?! 본문

개발Article

[TIL]20240706 드디어 람다를 이해할 수 있나..?!

최밤빵 2024. 7. 7. 03:06

자바 5주차 강의를 안 듣고 넘어온 스프링.....

람다와 스트림은 짝꿍인지 입문 강의 실습부터 심심찮게 붙어와서 기술매니저님 멘토링 시간에 람다 를 왜썼냐는 질문에 

망충하게 강사님이 쓰셔서요!! 라고 대답할 순없어서 혼자서 나름 열심히 찾아봤는데 속시원한 답을 알수가 없었다 ㅠㅠㅠ 

그래서 기술매니저님이 보는 코드면 무조건 다 풀어쓰고 그러고있는데 람다를 모르고 넘어가진 못할것같아서 공부했다.

 

▶람다식 (Lambda Expression)

람다식은 메서드를 하나의 식으로 표현한 것이다. 함수를 간략하면서도 명확하게 표현할 수 있게 해준다.

메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어져서 익명함수라고도 한다. 

int[] arr = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1);

 (i) -> (Math.random()*5+1);  이부분이 람다식!

이 한문장이 표현하는건,

int method(int i) {
    return (int)(Math.random()*5) + 1;
}

위 한 문장으로 이걸 표현한거니까 간결하면서도 이해하기 쉽다는 건 잘 알 수 있지만, 솔직히 저거 한 줄 줄인건데 간결과 상관이 있나? 그런 생각을 계속하면서 왜 써야하는지? 왜 쓰는지에 대한 궁금증이 마구 생기는 중.

 

원래 모든 메서드는 클래스에 포함되야하니까 클래스도 새로 만들어야하고,  객체도 생성해야 메서드를 호출 할 수 있는데, 람다식은 이런 과정 없이 람다식 자체로만 이 메서드의 역할을 대신 할 수있다. 람다식은 매개변수로 전달되어지는 것이 가능하고, 메서드의 결과로 반환될 수도 있다. 

 

▶ 람다식 작성법 

메서드를 람다식으로 만드는 방법은 아주 간단하다! 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 {} 사이에 -> 를 추가하기만 하면 된다. 

int max(int a, int b) {
    return a > b ? a : b;
}

원래는 이런 식이였다면, 

(int a, int b) -> {
    return a > b ? a : b;
}
(int a, int b) -> a > b ? a : b
(a, b) -> a > b ? a : b

반환값이 있는 메서드의 경우 return문 대신 식으로만 작성할 수 있는데, 식의 연산 결과가 자동적으로 반환값이 된다. 

이 때는 문장이 아닌 식이라서 끝에 ;(세미콜론)을 붙이지 않는다. 

 

람다식에 선언된 매개변수의 타입은 예측이 가능할 겅우에 생략할 수 있는데 대부분의 경우에 생략이 가능하다 . 

람다식에 반환타입이 없는 이유도 항상 추론이 가능하기 때문이다. 

 

추가+)

public List<MemberResponseDto> getAllMembers() {
    return memberRepository.findAll().stream()
          .map(member -> toResponseDto(member))
          .collect(Collectors.toList());
}
public List<MemberResponseDto> getAllMembers() {
    List<Member> members = memberRepository.findAll();
    List<MemberResponseDto> memberDtos = new ArrayList<>();
    for (Member member : members) {
       memberDtos.add(toResponseDto(member));
    }
    return memberDtos;
}

람다식을 쓴 예제와 안쓴 예제 

사실 두 세줄 길어지는 정도라 간결해졌다 라고 하긴 민망할 정도지만, 그래도 나는 람다식을 잘 쓰고싶다. 

뭔가 더 일관성있어보이고좋은데.... 기술매니저님 질문에 뭐라고 설명해야할지 아직도 모르겠다.

전에 간결어쩌구 했다가 저정도차이인데 굳이? 라고 하셨는데 진짜 속시원한 답을 알고싶다!!!!!!!!!!!!!! 

 

오늘의회고

가깝지는 않지만 친절하신 시온님께서 설명을 잘해주셔서 람다에 대한 이해가 되네!! 라고 생각했었는데 

내가 설명하려고 보니 못하는걸보면 난 아직 이해하지 못한것같다.... 요즘은 알게되는것보다 이해못해서 자꾸 깊게파고들다 이상한 정보를 얻고 그걸 이상하게 외우고다니는게 더 많은것같은데. 아무래도 좀 혼나야될거같다😟

'개발Article' 카테고리의 다른 글

[TIL]20240708 MVC패턴  (0) 2024.07.09
[WIL]20240707 Spring은 너무 팍팍해...  (0) 2024.07.07
[TIL]20240705 @Autowired  (0) 2024.07.06
[TIL]20240704 @어노테이션  (0) 2024.07.04
[TIL]20240703 코드리뷰...!  (0) 2024.07.04