모던 자바 인 액션 19장 (2)

게으른 리스트 만들기

스트림 API와 함수형 프로그래밍 개념을 이용하여, 메모리 낭비를 덜 하는 linked list를 만들어보자.

익히 알고 있는 linked list는, 모든 리스트의 내용이 메모리에 얹어져 있다. 하지만 책에서 만드는 LazyList는 Function이 ‘요청해야 생성’되는 구조이다.

긴 말이 필요없다. 코드를 본다.

이 코드는 아직 Lazy한 로딩방식이 아니다. 일반적인 Linked list처럼 모든 요소들이 메모리에 얹어져 있다.(인스턴스 생성과 동시에 리스트의 모든 요소들이 존재하게 된다.)

요렇게 만들어야 하니까요….

그럼 이제 게으른 리스트를 만들어 보자

Supplier!!!

tail을 Supplier타입의 클래스 변수로 선언하게 되면서, ‘값’이 아닌 ‘행위(메소드’ 를 tail에 갖게 된다.

  • 당장 메모리에 얹어야 하는 ‘값’이 아닌, (언젠간 실행이야 되겠지만)실행하기 전까진 메모리에 얹어져있지 않은 로직만 기억하고 있는 개념

뭐…그렇다고 한다

거의 대부분의 경우에는 좋긴 하겠다. 내가 사용하지도 않을 실행과정까지 굳이 꾸역꾸역 미리 실행되면 시간적,공간적 낭비가 심하겠지만… 뭐 구조를 보면 알다시피

  • 만들어진 자료구조의 (예를 들어)90%이상을 거의 항상 사용하는 상황
  • 그리고 이 자료구조가 매우매우 깊은 depth를 거치는 동작이 여러번 재사용 되는 경우(lazy한 로직이 재귀적으로 여러번 돌아야겠지)

이런 예외적인 케이스에서는 훨씬 비효율적일 수 있겠다.

자바로 패턴 매칭 흉내내기(?)

패턴 매칭이라는 함수형 프로그래밍의 특성을 이용하면 코드를 매끄럽게 만들 수 있다고 한다.

사실 이건 잘 이해가 안되는 영역인데…. 일단 자바라는 언어가 패턴매칭이 미구현 된 언어라고 하니…ㅋㅋ

수학에서 다음과 같은 함수가 있다고 하자.

  • f(0) = 1
  • f(n) = n*f(n-1) 그렇지 않으면 (?????)

자바에서 이걸 구현한다고 하면, 필연적으로 if문이나 switch문이 필요하게 된다.

개발하면서 알다시피 if가 난립하고 for가 난립하는 순간부터 가독성이 개가 된다는 걸 우린 너무너무너무너무나도 잘 알고 있다.

패턴 매칭을 사용하면 이러한 불필요한 잡동사니를 줄일 수 있다고 한다.

간단한 수학언어

숫자, 그리고 바이너리 오퍼레이터로 구성된 수학언어가 있다고 가정한다.

우리는 여기서 표현식을 단순화 할 수 있는만큼 최대한 단순화 하는 메소드를 구현해야 하는 업무를 받았다.(항등원 생각난다)

  • 덧셈의 항등원은 0이므로… n+0 = n –> n 으로 단순화 할 수 있다
  • 곱셈,나눗셈의 항등원은 1이다.. n*1 = n –> n 으로 단순화 할 수 있다.

이걸 코드로 짜면

보기만 해도 && 의 연타에 머리가 어지러울 지경이다

Leave a Comment