티스토리 뷰

Java/Effective Java

[Item42] 람다 쓰자!

ryumodern 2022. 3. 28. 22:08

Item42에서는 익명 클래스보다 람다를 사용하라 말한다

lambda expression은 자바 8부터 등장해 자바에서도 함수형 프로그래밍이 가능해지도록 본격적인 FP의 장을 열었다

자바8 이전에는 FP가 불가능했느냐 하면 그건 아니지만 욕먹어도 쌀 수준의 코드를 작성해야 했다

 

람다는 왜 나왔을까?

구현해야 할 코드가 단순하더라도 익명 클래스를 직접 구현하는 그 과정이 아주 지독하기 때문이란다

아래 코드에서 JDK 1.8 이전 방식을 보면 절로 한숨이 나온다

 

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

 

// JDK 1.8 이전 방식
Collections.sort(words, new Comparator<String>() {
  @Override
  public int compare(String o1, String o2) {
    return Integer.compare(o1.length(), o2.length());
  }
});

// 1차 개선
Collections.sort(words, (o1, o2) -> Integer.compare(o1.length(), o2.length()));

// 2차 개선
Collections.sort(words, Comparator.comparingInt(String::length));

// 3차 개선
words.sort(Comparator.comparingInt(String::length));

 

1차 개선에서 익명 함수를 람다로 바꾸고

2차 개선에서 Comparator의 static method, 헬퍼 메서드를 이용해 더 간결하게 만들 수 있다

3차 개선에서는 Collection에 추가된 default method를 이용해 Collections 유틸 클래스를 사용할 필요도 없어졌다

 

자바스크립트 사용자라면 first class citizen에 익숙할 것이다

동작을 나타내는 함수 자체를 값으로 다루는 개념인데 이를 통해 parameterized behavior, 동작 매개변수화가 가능해지고

함수를 인자로 넘기거나 반환 값으로 받는 고차 함수도 이용할 수 있다

자바스크립트에서 FP는 사용자와 직접 맞닿아 있는 클라이언트 사이드라 비동기적으로 돌아가는 게 중요해서 더 발달한 듯한데

우테코의 테크톡 중 FP와 관련한 영상을 보고 커링이고 모나드고.. 이해하진 못 했지만 참 재미져 보인다라는 생각이 들었다

여유가 좀 생기면 함수형 프로그래밍도 공부해봐야겠다

 

람다가 등장하며 자바에서도 메서드를 일급 시민으로 다룰 수 있게 되어 훨씬 더 간결한 코드를 작성할 수 있다

간결함 보다 중요한 것은 직관적인 표현력인데 람다나 스트림은 찰떡이다

SQL을 다루듯 애플리케이션 코드를 다룰 수 있고 세부 구현은 로우 레벨로 자바가 최적화해놨다

속도가 정말 중요한 프로그램에서는 직접 if, for문으로 작성하는 게 낫겠으나 대부분의 상황에서는 람다, 스트림을 돌려도 된다

빡센 알고리즘 문제가 아니라면 람다, 스트림으로도 풀 수 있기도 하고

 

다만 람다에도 한계가 있다

람다는 그 자체로 익명 함수이기에 문서화할 수 없으며

람다 안에서의 this는 람다를 둘러싸고 있는 코드 블록으로 스코프가 정해져 self 참조를 할 수 없다

위 설명만 보면 '아니 저걸 어따 써' 싶은데

Observer Pattern에서 자신의 변화를 감지하여 구독을 끊을 필요가 있는 상황에서 쓰인다고 한다

이러한 경우 가독성을 포기하고 boiler plate 그득한 익명 함수로 돌아가야 한다

 

람다는 제네릭과 함께 사용하는 것이 필수적이다

람다의 타입 정보는 컴파일러가 람다의 선언된 함수형 인터페이스에서 제네릭 정보를 뽑아와 추론하는데

raw type으로 직접 받아버리면 컴파일 에러를 뿜어준다

// 에러 뿜뿜 코드
Object object = (o) -> {};

 

자바 컴파일러는 람다를 보고 풀어헤쳐 익명 함수로 만들어 이해한다

익명 함수가 됐을 때 제네릭이 제대로 들어가 있어야 한다, 즉 함수형 인터페이스에서 제네릭 정보가 있어야 이해할 수 있다

https://stackoverflow.com/questions/49796284/why-we-cant-assign-lambda-expression-directly-to-reference-variable-of-type-obj

 

조만간 백기선님의 이펙티브 자바 강의가 나온다고 한다

백기선님 유튜브의 광고 영상에서 그가 말했듯 이펙티브 자바는 정말 쉽지 않은 것 같다

난 들을 생각은 없지만 혼자 공부하는 게 어려우면 들어볼 만할 것 같다

단순하게 아이템에 나온 조언들을 룰루랄라 따라만 해도 본전은 가지만

아이템들에서 스치듯 언급했던 내용 기반으로 확장해나가면 끝이 안 보인다

3 회독을 했음에도 불구하고 블로그 정리를 위해 다시 한번 읽어보면 새 책인가 싶다

차근차근하다 보면 5월쯤엔 끝나지 않을까..?

댓글
링크
글 보관함
«   2024/09   »
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
Total
Today
Yesterday