메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

함수형 프로그래밍 with 자바

함수형 프로그래밍을 적용하여 객체 지향 자바 코드 향상시키기

한빛미디어

번역서

판매중

  • 저자 : 벤 바이디히
  • 번역 : 허귀영
  • 출간 : 2024-03-27
  • 페이지 : 528 쪽
  • ISBN : 9791169212175
  • 물류코드 :11217
  • 초급 초중급 중급 중고급 고급
5점 (22명)
좋아요 : 15

모던 자바의 새로운 전환점, 함수형 프로그래밍에 집중하라. 

람다와 스트림을 활용한 자바 함수형 프로그래밍 실전 가이드

 

자바는 전통적으로 객체 지향 프로그래밍 언어였지만 자바 8부터 람다 표현식, 스트림 API, Optional 클래스 등 함수형 프로그래밍을 지원하는 다양한 기능을 도입하기 시작했습니다. 이러한 기능을 통해 자바에서도 함수형 프로그래밍이 중요한 패러다임으로 자리 잡게 되었습니다. 특히 대규모 데이터 처리나 분산 시스템, 클라우드 컴퓨팅과 같은 복잡한 요구 사항을 다룰 때 이러한 함수형 프로그램 기능이 효과적으로 활용됩니다.


이 책에서는 함수형 프로그래밍에 새롭게 도입된 다양한 기능을 실전 예제와 함께 소개하고, 기존 자바 코드를 함수형 스타일로 변환하는 방법을 구체적으로 다룹니다. 또한 실무에서 자주 활용되는 일반적인 객체 지향 디자인 패턴을 살펴보고, 함수형 접근 방식이 이러한 패턴에 어떤 이점을 제공하고 있는지도 살펴봅니다. 자바에서 함수형 프로그래밍을 활용하여 코드를 더 간결하고 명확하게 작성하고 싶은 모든 이에게 이 책은 훌륭한 실전 안내서가 되어줄 것입니다.

 

★ 이 책의 내용

  • 함수형 프로그래밍의 고수준 개요
  • 함수형 사고방식 키우기
  • 다양한 함수형 프로그래밍 개념 및 함수형 프로그래밍 활용 방법
  • 언어나 패러다임에 구애받지 않는 프로그래밍 스킬 높이기
  • 자바의 새로운 함수형 기능을 완전히 채택하지 않고 업무에 바로 활용하는 방법
벤 바이디히 저자

벤 바이디히

4살 때 처음 컴퓨터를 사용했고 독학으로 개발자가 되었습니다. 20년 가까이 웹, 모바일 및 시스템 분야에서 다양한 언어의 프로그래밍 경력을 쌓았습니다. 국제 임상 연구 기관에서 소프트웨어 개발과 프로젝트 관리를 배운 후 자영업 소프트웨어 개발자가 되었습니다. 그리고 여러 프로젝트에서 장기간 밀접한 협력을 통해 SaaS 회사와 합병하게 되었고, 공동 이사로서 회사의 방향을 결정하고 자바를 기반으로 한 제품의 모든 영역에 참여하며 모바일 전략을 감독하고 구현했습니다. 여가 시간에는 자바, 함수형 프로그래밍, 모범 사례, 일반적인 코드 스타일 등에 대해 글을 쓰며 그간 쌓아온 전문 지식과 경험을 공유합니다. 또한 오픈 소스 커뮤니티에 참여하여 프로젝트의 기여자로 활동하거나 코드를 공개하기도 합니다.

허귀영 역자

허귀영

모바일 애플리케이션 창업을 통해 소프트웨어 개발에 흥미를 느껴, 개발자로서의 커리어를 시작했습니다. 동덕여자대학교 컴퓨터학과를 졸업한 후 롯데정보통신과 카카오뱅크에서 소프트웨어 엔지니어로 근무했습니다. 어제보다 더 성장한 개발자가 되는 것을 목표로 하고 있습니다. 인프라, 웹 서비스, 프로젝트 관리 분야에 관심을 가지고 있으며, 새로운 지식을 습득하고 이를 다른 사람들과 나누는 것에서 큰 즐거움을 느낍니다.

[PART Ⅰ 함수형 기초]
 

CHAPTER 1 함수형 프로그래밍 소개
1.1 어떤 것이 언어를 ‘함수형’으로 만드는가?
1.2 함수형 프로그래밍의 개념
1.3 함수형 프로그래밍의 장점
1.4 함수형 프로그래밍의 단점
핵심 요약


CHAPTER 2 함수형 자바
2.1 자바 람다란?
2.2 람다의 실전 활용
2.3 자바의 함수형 프로그래밍 개념
핵심 요약


CHAPTER 3 JDK의 함수형 인터페이스
3.1 네 가지 함수형 인터페이스
3.2 함수형 인터페이스 변형이 많은 이유
3.3 함수 합성
3.4 함수형 지원 확장
핵심 요약

 

[PART Ⅱ 함수형 접근 방식]
 

CHAPTER 4 불변성
4.1 객체 지향 프로그래밍의 가변성과 자료 구조
4.2 함수형 프로그래밍의 불변성
4.3 자바 불변성 상태
4.4 불변성 만들기
핵심 요약

 

CHAPTER 5 레코드
5.1 데이터 집계 유형
5.2 도움을 주기 위한 레코드
5.3 사용 사례와 일반적인 관행
5.4 레코드를 마무리하며
핵심 요약

 

CHAPTER 6 스트림을 이용한 데이터 처리
6.1 반복을 통한 데이터 처리
6.2 함수형 데이터 파이프라인으로써의 스트림
6.3 스트림 파이프라인 구축하기
6.4 스트림 사용 여부 선택
핵심 요약

 

CHAPTER 7 스트림 사용하기
7.1 원시 스트림
7.2 반복 스트림
7.3 무한 스트림
7.4 배열에서 스트림으로, 그리고 다시 배열로
7.5 저수준 스트림 생성
7.6 파일 I/O 사용하기
7.7 날짜와 시간 처리하기
7.8 JMH를 활용하여 스트림 성능 측정하기
7.9 컬렉터 알아보기
7.10 (순차적인) 스트림에 대한 고찰
핵심 요약

 

CHAPTER 8 스트림을 활용한 병렬 데이터 처리
8.1 동시성 vs 병렬성
8.2 병렬 함수 파이프라인으로써의 스트림
8.3 병렬 스트림 활용
8.4 병렬 스트림 활용 시기와 주의할 점
핵심 요약

 

CHAPTER 9 Optional을 사용한 null 처리
9.1 null 참조의 문제점
9.2 자바에서 null을 다루는 방법 (Optional 도입 전)
9.3 Optional 알아보기
9.4 Optional과 스트림
9.5 원시 타입용 Optional
9.6 주의 사항
9.7 null 참조에 대한 생각
핵심 요약

 

CHAPTER 10 함수형 예외 처리
10.1 자바 예외 처리 핵심 요약
10.2 try-catch 블록
10.3 람다에서의 체크 예외
10.4 함수형으로 예외 다루기
10.5 함수형 예외 처리에 대한 고찰
핵심 요약

 

CHAPTER 11 느긋한 계산법 (지연 평가)
11.1 느긋함 vs 엄격함
11.2 자바는 얼마나 엄격한가?
11.3 람다와 고차 함수
11.4 썽크를 사용한 지연 실행
11.5 느긋함에 대한 고찰
핵심 요약

 

CHAPTER 12 재귀
12.1 재귀란 무엇인가?
12.2 더 복잡한 예시
12.3 재귀와 유사한 스트림
12.4 재귀에 대한 고찰
핵심 요약

 

CHAPTER 13 비동기 작업
13.1 동기 vs 비동기
13.2 자바의 Future
13.3 CompletableFutures로 비동기 파이프라인 구축
13.4 수동 생성 및 수동 완료
13.5 스레드 풀과 타임 아웃의 중요성
13.6 비동기 작업에 대한 고찰
핵심 요약

 

CHAPTER 14 비함수형 디자인 패턴
14.1 디자인 패턴이란?
14.2 (함수형) 디자인 패턴
14.3 함수형 디자인 패턴에 대한 고찰
핵심 요약

 

CHAPTER 15 자바를 위한 함수형 접근 방식
15.1 객체 지향 프로그래밍과 함수형 프로그래밍 원칙 비교
15.2 함수형 사고방식
15.3 명령형 세계의 함수형 아키텍처
15.4 자바에서 함수형 접근에 대한 고찰
핵심 요약

객체 지향의 진화, 함수형 프로그래밍으로 자바 코드 최적화


이 책은 함수형 프로그래밍(FP)의 핵심 개념을 깊이 있게 다루며, 특히 자바에서 FP를 채택하는 구체적인 이유를 상세히 설명합니다. 1부에서는 FP의 핵심 개념과 역사, 자바에서 FP를 구현하는 방법과 사용 가능한 기능에 대해 소개하고, 2부에서는 새롭게 도입된 기능들을 어떻게 적용할 수 있는지 배워봅니다. 이 과정에서 레코드와 스트림 같은 주요 기능들을 다양한 예제로 학습할 뿐만 아니라, 자바에 FP를 실제로 적용해보며 코드의 유연성과 확장성을 높이는 노하우를 엿볼 수 있습니다. 더불어 OOP와 FP를 비교하며 설명하여, 누구나 오해하기 쉬운 내용까지 명확하게 이해할 수 있게 도와줍니다.

2024년 3월에 출간된 한빛미디어의 <함수형 프로그래밍 with 자바>에 대해 알아보겠습니다. 이 책의 원서는 <A functional approach to java>이며, 2023년 6월에 출간되었습니다. 원서 출시일을 보면 번역서가 꽤 빨리 나왔고, 역자와 출판사의 노력의 흔적이 보입니다.

 

이 책의 저자는 Ben Weidig이며, 아마존 평가 점수는 5점 만점에 4.3점으로 비교적 높은 평가를 받은 책입니다. 국내 서점에서의 평가 점수는 교보문고, YES24 그리고 한빛미디어에서 4점대 후반으로 높은 점수를 받고 있습니다.


 

<함수형 프로그래밍 with 자바>는 약 530여 페이지로 구성되어 있으며, 휴대하면서 보기에는 힘들 것 같습니다. 태블릿이 있으신 분은 전자책으로 보는 것을 추천합니다. 
 

 

 

한빛미디어의 도서 지원을 받아 작성한 리뷰입니다. 

한빛미디어에서 제공해 준 책을 읽고 작성했음을 밝힙니다.

 


 

이 책의 매력 포인트


필자는 함수형 프로그래밍에 관심이 많습니다. 함수형 프로그래밍 관련 책도 많이 보았고, FP 학습도 꾸준히 하고 있습니다. 그래서 이 책의 출간 소식을 들었을 때, 꼭 읽고 싶은 생각이 들었는데, 한빛미디어에서 좋은 기회를 주셔서 읽게 되었습니다. 

 

<함수형 프로그래밍 with 자바>는 자바를 기반으로 함수형 프로그래밍을 할 수 있도록 안내하는 책입니다. 자바 8부터 함수형 프로그래밍이 조금씩 언어에 내재화되었습니다. 그리고 자바가 꾸준히 업그레이드되면서 도입 시점에 비해 활용처가 넓어지고 있는 것 같습니다. 

 

이 책은 두 개의 파트와 15개의 챕터로 구성되어 있습니다. 첫 번째 파트는 함수형 프로그래밍의 개요 부분이며, 3개의 챕터로 구성되어 있습니다. 두 번째 파트는 실제 자바에 도입된 함수형 프로그래밍 기법에 대해 소개하며, 12개의 챕터로 구성되어 있습니다. 

 

파트 1에서 함수형 프로그래밍의 기본 개념과 함수형 인터페이스에 대해 잘 이해하고 파트 2로 넘어가는 것이 좋습니다. 평소에 사용하던 프로그래밍과 조금 다른 접근 방법으로 다소 어렵게 느껴질 수 있습니다. 하지만 일반 함수형 프로그래밍에 대한 것보다는 자바에서 지원하는 함수형 프로그래밍 기법과 도구들에 대해 설명하고 있는 부분은 더 친근하게 느껴질 것 같습니다. 그리고 자바의 함수형 프로그래밍 기법들을 그림과 함께 상세히 설명하고 있어 관련 지식을 이해하는 데 도움을 받을 수 있습니다. 

 

이 책을 읽고, 연습을 꾸준히 하다 보면 자연스럽게 자바에서 함수형 프로그래밍을 할 수 있을 것으로 생각합니다. 처음에는 낯설게 느껴질 수 있겠지만, 꾸준히 한 걸음씩 나아가면 자연스럽게 함수형 프로그래밍을 하고 있는 나를 발견할 수 있을 것입니다. 

 

 

마치면서


<함수형 프로그래밍 with 자바>는 비교적 최신 원서를 번역한 책입니다. 따라서 빠른 출간으로 말미암아 편집 과정에서 실수가 보이는 부분도 조금 있습니다. 이 부분은 출판사 정오표를 확인하시면 좋을 것 같습니다.

 

이 책은 자바 언어를 기반으로 함수형 프로그래밍 패러다임을 잘 설명하고 있습니다. 자바 언어를 주로 사용하는 개발자이면서 함수형 프로그래밍에 관심 있으신 분은 도움을 받을 수 있을 것입니다. 

함수형 프로그래밍을 접한 지 얼마 되지 않았고 객체 지향과 어떤 점이 다른지, 왜 사용하는지, 

대규모 데이터 처리와 분산 시스템, 클라우드 컴퓨팅 등의 현대 개발 환경의 복잡한 요구 사항에 왜 효과적인지 알고 싶어서 책을 읽게 되었다.

 

함수형 프로그래밍의 개념을 7개로 나누어 설명이 된다.
위 특성들은 서로 연결되어 있다.

함수형은 추상함수를 생성하고 조합하여 논리 연산을 표현하며 프로그램을 변경시키지 않는다.
불변성을 갖게 되면 초기화된 이후 자료구조를 변경할 수 없고 이에 따라 일관성을 보장하고 예측 가능하며 이해하기 쉬워진다.
순수 함수형 프로그래밍은 종종 반복문이나 반복자 대신 재귀를 선호하는 경향이 있다.

일급함수는 프로그래밍 언어에서 함수를 소위 '일급 객체'로 대우하는 것을 의미한다. 함수 자체를 다른 함수에 인수로 전달하거나 반환값으로 사용할 수 있으며 변수에 할당할 수 있는 함수를 지칭한다.
고차 함수는 일급 객체의 특성을 바탕으로 함수를 인수로 받거나 반환하거나 또는 두 가지 모두를 가능하게 한다.

핵심은 객체 지향은 클래스(또는 객체, Object)가 일급 객체가 되지만,
함수형 프로그래밍에서는 함수(Function) 자체가 일급 객체가 된다는 점으로 보인다.

스트림 API 를 이용하여 함수형 데이터 파이프라인으로써의 스트림에 대해서도 다룬다. 
재귀 그리고 스트림을 다루는 방법을 통해 왜 대규모 데이터 처리에 강점을 보이는 지 알 수 있었다.
객체 지향은 비교적 속도가 느리다는 단점이 있다.

결론부터 말하자면 내겐 굉장히 어려운 책이었다.
객체 지향이 당연하듯 익숙했던 내게 함수형 프로그래밍은 많이 낯설었기 때문이다.
책에 나온 것처럼 함수형 프로그래밍의 좋은 부분들을 선택하고 객체 지향을 보완하는 게 좋지 않을까 라는 생각이 들었다.
결국 프로그래밍 이론에 정답은 없으니 말이다.

✅ 함수형 프로그래밍이란 무엇일까요?

우선, 함수형 프로그래밍에 대해 간단히 설명해 볼게요. 함수형 프로그래밍은 프로그래밍 패러다임 중 하나인데요. 함수형 프로그래밍은 계산을 수학적 함수의 평가로 판단하고, 상태와 가변 데이터를 멀리하는 방식을 가지고 있어요.

이게 무슨 말이냐면, 코드의 실행이 입력 값을 출력 값으로 매핑하는 과정에 집중한다는 거예요. 객체의 상태를 변경하지 않고, 데이터 처리를 수학적 함수의 조합으로 생각하는 방식이라는 뜻이에요.

✅ 자바와 함수형 프로그래밍의 만남

"잠깐, 자바는 객체 지향 프로그래밍(OOP) 언어잖아?"라고 생각하실 수 있어요. 맞아요, 자바는 근본적으로 객체 지향 언어이지만, 자바 8부터는 람다 표현식, 스트림, 옵셔널 등 함수형 프로그래밍을 지원하는 기능들이 추가되었어요.

이로 인해 자바 개발자들도 불변성, 고차 함수(Higher-Order Functions), 함수 체이닝(Function Chaining) 등 함수형 프로그래밍의 혜택을 누릴 수 있게 되었죠.

✅ 함수형 프로그래밍 with 자바

자바를 사용하면서 조금 더 현대적인 방식으로 코드를 작성하고 싶다면, 이 책이 도움되실 거예요!

"함수형 프로그래밍 with 자바 ; A Functional Approach to Java"는 기본적으로 자바에서 함수형 프로그래밍의 접근 방식을 소개하고 있어요. 객체 지향 프로그래밍(OOP)만 주구장창 하다가 함수형 프로그래밍(FP)의 세계로 조금씩 발을 들이고 싶은 분들에게 딱이에요.

✅ 함수형 프로그래밍 기본

람다 표현식부터 시작해서 고차 함수, 순수 함수 같은 기본 개념들을 쉽게 설명해 줘요.

◻︎ 자바 스트림 API
이 부분은 정말 마음에 들었어요. 컬렉션을 다루는 새로운 방법을 배울 수 있었거든요.

◻︎ 불변성
코드를 더 안전하고 예측 가능하게 만드는 불변 객체의 중요성을 알려줘요.

✅ 장점은 뭐가 있을까요? ✨

◻︎ 이해하기 쉬움

복잡한 개념도 쉽게 풀어서 설명해 줘서, 함수형 프로그래밍 초보자도 이해하기 쉬워요.

◻︎ 실용적인 예제

이론만 나열한 게 아니라, 실제로 어떻게 활용할 수 있는지 예제를 통해 보여줘요. 저도 예제를 따라 해보면서 많이 배웠답니다!

✅ 추천독자

자바로 개발하면서 새로운 프로그래밍 패러다임에 도전하고 싶은 개발자, 함수형 프로그래밍의 기초를 다지고 싶은 분, 코드의 가독성과 유지보수성을 높이고 싶은 분들이 읽는다면 도움이 되실 거예요.

자바와 친해지고 싶거나, 함수형 프로그래밍에 관심이 있는 분이라면 "함수형 프로그래밍 with 자바 ; A Functional Approach to Java"는 정말 좋은 선택이 될 거예요. 이 책 한 권으로 여러분의 자바 실력을 한 단계 업그레이드시킬 수 있을 거예요!
 

 

 

 

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.


 대학교에서 과제나 학교공부를 하다보며 자연스럽게 수업에서 자주 다루는 자바를 많이 활용합니다. 그래서 다양한 친구들의 자바 소스코드를 구경했습니다.  보통 학교에서 가르치고 요구하는 스타일은 자바 8.0 이전의 스타일입니다. (제 개인적인 경험으로는) 과제 코드 자체가 2000년대 초의 Java 1.4 코드거나 제약 조건이 있고 예전 강의자료를 기반으로 대표적인 문법을 쓰기에 그런 것 같습니다. 그래서 그런지 주변의 친구들이 자바를 활용하는 방식을 보면 디자인 패턴이나 객체 지향 등을 공부하며 OOP 스타일의 자바는 익숙하지만 함수형 스타일은 아예 모르는 경우가 많았습니다. 보통은 람다의 개념도 얼추 알지만 그냥 일회성으로 구현을 할 수 있어서 짧게 쓰는 용도로 함수형 문법을 받아들인 친구도 많았습니다.

가끔은 함수형 언어에서는 어떤 관점으로 문제를 어떻게 표현하고 풀어나가는지 데이터, 순수 함수, 고차 함수를 통한 추상화, 테스트, 스트림 처리 등의 선언적으로 코드를 짜는 예시를 보여주며 쭉 설명하고는 합니다. 요즘 선언적으로 UI를 만들 수 있는 라이브러리가 유형하며 프론트엔드를 해본 친구들은 괜찮은데 순수 자바나 게임 쪽만 판 친구들의 표정은 되게 묘했습니다. 이런 함수형 스타일이 자바에 어떻게 실용적으로 적용할 수 있는지 잘 와닿지 않아 의문인 친구도 있었습니다. 추상적인 내용에 헷갈려하는 친구들에게 추천해줄만한 책인 것 같아서 반갑습니다.

이 책은 자바에서 함수형 스타일로 짜는 여러 방법들을 나열만 하지 않고 함수형으로 어떻게 접근하고 자바에서는 이런 관점으로 어떻게 문제를 풀어갈 수 있는지 설명합니다. 함수형에서 자주 사용하는 개념도 설명되어 있어서 따로 찾아보지 않아도 충분히 이해할 수 있을 것 같습니다. 가끔은 함수형 개념을 찾아보다 보면 너무 이상적이거나 수학적이라서 어떻게 사용하라는 건지 모르겠는 경우도 있습니다만 이 책은 자바로 되어 있어서 그런지 함수형 문법 때문에 막힌적이 거의 없었고 편하게 학습할 수 있었습니다. 물론 함수형의 단점, 불리한 점, 특정 방식의 오버 헤드들도 다룹니다.

혹시라도 함수형 문법을 단순히 자바 문법을 축약해서 편하게 사용할 수 있게 해주는 기능이라고 생각한다면 한번 읽어보시는 것을 추천합니다.

 

평소 자바8의 스트림(Stream)과 람다(Lambda), 옵셔널(Optional)에 관해 관심이 많았거나, 제대로 사용하기를 원한다면 꼭 이 책을 읽기를 추천한다. 또한 자바 공부가 자바6이나 순수자바를 사용한 프로그래밍에서 멈춰있고, 모던 자바(~자바21)를 알고 싶은 분들도 마찬가지다.

 

서점에 있는 자바서적은 스트림과 옵셔널에 관해 간략 소개나 사용법 위주로 설명하지만, 이 책은 함수형 프로그래밍 개념부터 기술이 나온 배경과 고려할 점까지 알려주기때문에, 가장 빠르게 접근할 수 있을 것이다.

 

자바스크립트나 코틀린을 비롯하여 최근에 나온 프로그래밍에서 함수형 프로그래밍에 관해 자주 나왔는데, 자바에서도 함수형 프로그래밍이 나온지 10년이 지났다는 부분을 읽고 많이 당황스러웠다. ㅎㅎ

 

하지만, 이 책을 읽고난 후 Consumer, Supplier, Predicate, Function과 관련된 내용과 기존 클래스에 함수형 인터페이스로 확장하는 방법, 파이프라인을 개념적으로 쉽게 이해할 수 있었다.

 

한국에서는 운영 환경의 JDK가 아직 자바6, 자바8인 경우가 대부분이지만, 곧 자바17, 자바21로 변경될 것이며, 함수형 프로그래밍의 장점을 이해했으면, 반드시 꼭 읽어야 될 책이라고 생각한다.

 

이 책은 2개 PART, 전체 15개 장으로 구성되어 있다. PART 01은 3개의 장으로 구성되며, 함수형 프로그래밍의 개념과 역사, 장단점, 자바에서 제공하는 함수형 프로그래밍의 개념과 지원 내용을 설명하고 있고, PART 02는 12개의 장으로 구성되며, 함수형 프로그래밍의 개념이 자바에서 어떻게 지원하고 사용되는지 예제와 사례를 들어 설명한다.

 

세부 내용을 살펴보면, PART 01 함수형 기초의

CHAPTER 01 '함수형 프로그래밍 소개'에서는 일반적인 함수형 프로그래밍의 역사와 개념, 장단점에 설명하고,

CHAPTER 02 '함수형 자바'는 자바의 함수형 프로그래밍 기초가 되는 람다와 자바의 함수형 프로그래밍 개념에 관해 알려준다.

CHAPTER 03 'JDK의 함수형 인터페이스'에서는 자바의 함수형 인터페이스와 함수 합성 방법과 확장하는 법을 설명하고,

PART 02 함수형 접근 방식의

CHAPTER 04 '불변성'은 함수형 프로그래밍의 불변성 개념과 자바의 불변성 사례를 설명하고,

CHAPTER 05 '레코드'에서는 핵심 인재를 관리하는 방법에 관해 알아보고, 자바14부터 지원하는 record의 설명과 사용 사례, 관행에 관해 알아본다.

CHAPTER 06 '스트림을 이용한 데이터 처리'는 자바의 스트림(stream)의 원리와 특성에 관해 설명하고,

CHAPTER 07 '스트림 사용하기'에서는 스트림의 다양한 사용법을 예를 들어 알려준다.

CHAPTER 08 '스트림을 활용한 병렬 데이터 처리'는 동시성과 병렬성의 개념과 스트림을 사용한 병렬처리 방법, 주의할 점을 설명하고,

CHAPTER 09 'Optional을 사용한 null 처리'는 null 참조의 문제점과 Optional의 개념, 사용법을 알아본다.

CHAPTER 10 '함수형 예외 처리'에서는 자바의 예외와 에러를 처리하는 방법과 함수형으로 예외를 다루는 방법을 살펴보고,

CHAPTER 11 '느긋한 계산법(지연 평가)'는 느긋한 처리(지연 실행)의 장단점과 실제 사용방법을 알아본다.

CHAPTER 12 '재귀'에서는 재귀적 프로그래밍의 장단점을 알아보고, 함수형 프로그래밍으로 재귀적인 문제를 해결하는 방법을 살펴보고,

CHAPTER 13 '비동기 작업'은 동기와 비동기의 개념과 함수형 프로그래밍으로 비동기 작업을 처리하는 방법에 관해 알아본다.

CHAPTER 14 '함수형 디자인 패턴'에서는 디자인 패턴의 개념과 팩토리 패턴, 데코레이션 패턴, 전략 패턴, 빌더 패턴에 관해 함수형 프로그래밍으로 적용하는 방법에 관해 살펴보고,

CHAPTER 15 자바를 위한 함수형 접근 방식 - 웹스크래핑 관심사 분리, p571

<CHAPTER 15 자바를 위한 함수형 접근 방식 - 웹스크래핑 관심사 분리, p571>



CHAPTER 15 '자바를 위한 함수형 접근 방식'은 여태까지 설명한 자바의 함수형 프로그래밍을 전체적으로 정리하면서 마무리 한다.

 

각 장은 먼저 해당 주제의 개념과 함수형 프로그래밍을 사용할 때 좋은 점과 주의할 점을 예시를 통해 설명하고, 함수형 프로그래밍으로 다양한 사례를 들어 설명한다. 마지막에는 주제에 대한 추가로 고려할 점을 고민해보고 핵심 요약을 통해 마무리한다.

 

주제의 개념 설명은 자바나 함수형 프로그래밍에 국한되지 않고, 일반적인 개념부터 설명하기때문에 이론적으로 부족한 부분을 확실하게 짚을 수 있었고, 그림이 많아서 개념은 쉽게 이해할 수 있었으며, 예제의 난이도도 크게 어렵지 않았다. 중간중간 'NOTE', 'CAUTION'를 사용하여 주의 점과 팁, 고려할 점을 전달하니, 잘 챙겨보도록 하자.

 

아쉬운 부분은 2014년 자바8이후로 지금의 자바21까지 10년간 자바 언어에 함수형 프로그래밍이 도입되면서, 각 장의 주제와 지원되는 버전이 매번 달라서 전체적으로 버전과 기능을 정리한 페이지가 있었으면 좋았겠다고 생각했다. 개발자는 항상 최신 버전의 JDK가 아니라, 고객의 운영환경에 맞는 JDK를 사용하여 개발해야 하기때문이다.

두 번째는 아무래도 예제가 중간중간 생략된 부분이 있어서, 간단하더라도 컴파일이 되는 버전이면 더 좋겠다고 생각했다.

 

마지막으로 좋았던 부분은 CHAPTER 15 '자바를 위한 함수형 접근 방식'이었는데, 책의 내용 전체를 요약하는 것도 좋았지만, 개발자로써 객체 지향 프로그래밍과 함수형 프로그래밍을 어떻게 접근할 것인가에 관한 저자의 솔직한 의견이 많이 도움이 되었다.

 

저자가 생각하는 자바의 함수형 프로그래밍 접근방식을 인용하면서 마무리한다.



함수형 프로그래머가 되지 마세요.

객체 지향 프로그래머가 되지 마세요.

더 나은 프로그래머가 되세요.

브파이언 게츠, FP vs OO: Choose Two

 

소프트웨어 개발은 주어진 문제에 가장 적합한 도구를 선택하는 것입니다. 자바 개발자로서 우리에게 제공되는 함수형 개념과 기법들을 일상적인 작업에 도입함으로써, 우리의 도구함에는 가치 있는 새로운 도구들이 추가됩니다. 이러한 도구들은 코드를 더욱 읽기 쉽고, 이해하기 쉽고, 유지보수하기 쉽고, 테스트하기 쉽게 만들어 줍니다.

CHAPTER 15 자바를 위한 함수형 접근 방식, p522

 



"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 

#함수형프로그래밍 #자바 #벤바이디히 #허귀영 #한빛미디어 #optional #스트림 #람다 #fuctionalProgramming #FC

함수형 프로그래밍 with 자바

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

하여, 최대한 책을 펼쳐놓는 형태로 리뷰를 하려고 노력하였습니다.

책을 선택하실 때 참고하시면 될 것 같습니다.^^

 

1.  책을 쓴 이유 목적
람다, 스트림등 자바에서 제공하는 많은 함수형 기능의 깊이있는 이해와 활용을 할 수 있게 하기 위해
함수형으로 만드는 다양한 개념들과 JDK에서 제공하는 도구 or 직접 생성한 도구들로 자바 코드에 결합하는 방법을 설명하기 위해
자바 코드에 함수형 접근 방식을 적용하여 오류 발생 가능성을 줄이고, 더 간결하고 합리적이며 미래 지향적인 코드를 작성할 수 있다.

 

2. 대상 독자
함수형 프로그래밍이 궁금하거나 자바 코드에 직접 적용해보고 싶은 독자
자바에서 함수형 프로그래밍을 사용하고 있는 사람
자바 표준 라이브러리에 어느정도 익숙해 있는 사람
함수형의 개념과 관용구를 이해하고, 이러한 개념들을 자바 코드에 효과적으로 결합하는 방법을 알고싶은 사람  

 

3. 이 책에서 다루는 내용
합성composition : 모듈식으로 쉽게 합성할 수 있는 블록을 구축합니다.
표현식expressiveness : 의도를 명확하게 표현하는 간결한 코드를 작성합니다. 
코드 안정성safer code : 오류를 발생시키지 않고 경합 조건race condition이나 락lock을 처리할 필요가 없는 더 안전한 자료 구조를 만들 수 있습니다. 
모듈성modularity : 큰 프로젝트를 더 쉽게 관리할 수 있는 모듈로 분할합니다. 
유지보수성maintainability : 연관성이 적은 함수형 블록들을 사용하여 코드의 다른 부분을 손상시키지 않으면서 코드 변경이나 리팩토링을 더 안전하게 수행할 수 있습니다. 
데이터 조작data manipulation :  더 적은 복잡성으로 효율적인 데이터 조작 파이프라인을 구축합니다.
성능performance : 불변성과 예측 가능성을 통해 큰 고민 없이 병렬로 수평 확장이 가능합니다.

 

4. 책의 구성
PART01 함수형 기초
   함수형 프로그래밍 소개
   함수형 자바 
   JDK의 함수형 인터페이스
PART02 함수형 접근 방식
   불변성
   레코드 
   스트림을 이용한 데이터 처리 
   스트림 사용하기 
   스트림을 활용한 병렬 데이터 처리 
   Optional을 사용한 null 처리
   함수형 예외 처리 
   느긋한 계산법( 지연 평가 )
   재귀
   비동기 작업
   함수형 디자인 패턴 
   자바를 위한 함수형 접근 방식     

 

5. 소스 코드
https://github.com/benweidig/a-functional-approach-to-java

 

6. 소감
프로그래밍을 하는 과정은 문제를 해결해 가는 과정이기 때문에 그 과정안에서 어떤 언어나 기법을 사용하던 그것은 프로그래머의 전적인 자유라고 생각한다. 
다만, 그 프로그래머가 문제를 비즈니스의 구조에 맞게 가장 효과적이고 빠르게 해결할 수 있는 방법을 찾는게 가장 좋지 않나 생각한다. 
이 책에서는 그런 패러다임중에 함수형 프로그래밍을 어떨때 사용하고, 잘 사용하려면 어떻게 해야하는지에 대해 세부적으로 설명해 놓은 책인 것 같다. 
그 시대가 흘러가는 흐름의 프로그래밍 경향성은 분석을 하고 그 때, 그 때, 익혀두는 것은 좋은 것이라고 생각하지만, 실제 프로그래밍을 적용할 때는 자신의 기술과 비즈니스와 같이 협업을 하는 사람들의 능력들을 두루 고려해서 현 시대에 최신기술이라고 하더라도 굳이 그것을 꼭 쓸필요는 없다고 생각한다. 
하지만, 프로그래밍 패러다임이 바뀔때는 왜 그렇게 바뀌게 되는지, 그런 패러다임이 왜 나왔는지는 이해를 하고, 사용하는 방법을 익혀두는 건 좋은 방법이 아닌가 생각한다. 
어차피 기술의 흐름은 비즈니스 흐름을 타고 진화하기 때문이다. 그러나 그것을 적용하는 것은 상황에 맞게 적용하면 된다고 생각한다. 


이 책에서 나온 말 중에 가장 중요한 말은 아래 말이 아닌가 생각해서 옮겨본다. 
함수형 프로그래머가 되지 마세요. 
객체 지향형 프로그래머가 되지 마세요.
더 나은 프로그래머가 되세요. 
- 브라이언 게츠, FP vs OO : Choose Two -


문제를 더 잘 해결하는 사람이 되는게 중요한 게 아닌가 하는 생각을 해본다. 
이미 함수형 프로그래밍이 자바에 적용된지도 오래되었기때문에 자바에서 함수형 프로그래밍을 사용하고자 하는 사람들이 기본적인 내용을 다지고 개념을 정리하는데 도움이 되는 책이 아닌가 싶다. 

 “한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

 

 

 

함수형 프로그래밍을 사용한다면 코드를 간결하고 효율적으로 표현할 수 있다. 또한 복잡한 로직을 읽기 쉽게 리팩토링할 수 있으며 재사용 가능한 코드로 만들어준다. 

 

이전까진 '모던 자바 인 액션'을 통해 함수형 프로그래밍을 배웠다면 이제는 '함수형 프로그래밍 with 자바'로 함수형 프로그래밍을 배워도 좋을 거 같다고 생각한다. 모던 자바 인 액션도 람다와 함수형 프로그래밍을 다루지만 자바 8로 다루기 때문에 살짝 올드한 면이 있다. 

 

함수형 프로그래밍 with 자바에선 자바 17를 사용하고 있어 record나 새로운 스트림 문법들을 사용하여 좀 더 young하다고 생각한다. 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 자바를 처음 접한 게 대학 2학년 때였던 것 같다. 아주 핫한 언어였고, C/C++ 언어의 단점을 극복한 언어라면서 홍보도 많이 했었다. 컴파일러 성능을 개선하기 위한 논문이 쏟아졌고, 한 번에 처리할 인자 수를 늘리면서 성능이 대폭 개선됐다는 얘기도 들려왔다.

 실제 취직을 해서 웹 프로그래밍을 하게 되었을 때도 핫했던 Servlet/JSP 기술을 도입해서 만들어내느라 바빴다. 그만큼 자바는 산업계에 큰 파장을 일으켰다.

 그런데 어느 순간부터 자바가 자바스럽지 않게 되면서, 수많은 산업계의 요구사항이 빗발치면서 자바가 변했다. 그 변화를 따라잡는 게 쉽지 않아졌다. 심지어 선에서 오라클로 주도권이 바뀌기도 했다.

 잠깐 한 눈을 팔고 돌아와보니 내가 알던 자바는 완전 구닥다리처럼 변해 있었다. JVM에서 돌아가는 다른 언어를 익히고 나니, 자바 코딩이 너무 힘들어졌다. 스칼라는 객지지향 언어와 함수형 언어의 장점을 혼합한 언어였고, 러닝 커브가 거셌지만, 한 번 익히고 나니 그 간결함과 대폭 줄어든 코드량에 열광했다. 다만, val과 var의 차이점과, 과거 자바스럽게 코딩하던 버릇 때문에 적응이 어려웠다. 하지만 그 지점을 통과하고 나니 val만 쓰는 방식이 너무 편하다. 문제가 발생해도 값을 인식하지 못한 지점에서 바꾸는 상황이 없어지니 디버깅 하기도 수월해졌다.

 그런데 회사에서 스칼라를 버리고 자바로 가게 됐다. 그나마 최신 트렌드로 무장한 코틀린으로 가고자 했지만, 자바를 익힌 개발자들의 저항이 거셌다. 결국 현실적인 이유 때문에 코틀린으로 가지 못하고 자바로 회귀했다.

 가만 생각해보면, 자바가 과연 문제일까? 자바가 문제가 아니라, 자바식으로 코드를 작성하는 게 부담스럽다. 무엇 때문에? 막대한 코드량 때문이다. 최신 트렌드가 반영된 언어들과 자바로 같은 로직을 작성해보면, 그 양이 현격히 차이가 난다. 그래서 코드를 읽는 게 부담스럽기도 하고 로직이 먼저 보이는 게 아니라, 로직을 짜기 위해 필요한 코드들이 방해했다.

 뭔가 해결책이 필요했다. 그것이 자바 8 이후로 전격 도입된 함수형 프로그래밍 지원이었다. 처음에는 그런 코드들도 너무 군더더기가 많다고 생각했는데, 이 책을 읽으면서 이유를 알게 됐다. 바로 하위 호환성 때문이었다는 것. 새로 도입하는 거라면 과감하게, 최신 트렌드처럼, 간결하게 만들어도 됐을 텐데, 하위 호환 가능하도록 만들다보니 어쩔 수 없이 취해야 했던 모양새다.

 도입은 했는데, 이걸 내가 제대로 알고 쓰는 게 맞을까? 놓치고 있는 건 얼마나 될까? 사실 이걸 반영하기 위해 상용 IDE가 제안하는 도구들을 활용해서 조금씩 반영하곤 있었다. 하지만 이게 맞는 걸까? 그런 고민으로 부담감이 날로 커지는 가운데, 이 책을 만나게 됐다.

 정말 내가 필요로 했던 책이다. 그런데 단순히 개념만 설명하는 책은 아니었다. PART 01 함수형 기초를 읽을 때까지는 매우 고통스러웠다. 익숙하지 않은 전문용어가 많이 나왔다. 기술 용어? 아니다, 수학적 개념을 이해해야 하는 용어들이다. 번역하는 사람 입장에서도 힘들었겠다 싶었다. 지지부진하게 읽다가, 슬슬 속도가 붙기 시작한 지점이 record 설명할 때였다. 그나마 최신 언어에서 실험 중인 기능을 조금 써 봤다. 그러다보니 설명을 이해하는 게 많은 도움이 됐다.

 자바 람다에 대해선 피상적으로만 쓰고 있었는데, 확실하게 알게 되었던 건 큰 수확이다. 물론 정말로 잘 이해했고, 잘 활용하려면 기존 코드를 변경하고 비교해가면서 확고히 하는 수밖에 없겠지만, 그냥 모르는 채로 대충 쓰는 것과는 확실히 다르다. 빨리 적용해보고 싶을 지경이다.

 함수형 인터페이스 Function, Consumer, Supplier, Predicate 이것들은 알게 모르게 쓰고는 있었는데, 이제야 뭔지 알 것 같다. 역시 연습을 통해 확실하게 익혀둬야겠다.

 스트림 역시 마찬가지다. 스칼라에서 쓰던 형태 비슷하게 쓰고 싶어서 쓰기 시작했던 건데, 코드를 정리하기 위해서라도 더 많이 쓰려고 한다. 내가 관리하는 시스템은 성능보다는 명확한 로직과 의도, 유연한 추가나 변경이 더 중요한 시스템이다. 성능이 중요하지 않다기보다는, 지장이 없을 정도면 되고, 오히려 다양한 요구사항을 빠른 시간 안에, 안정적으로 제공해주는 게 더 중요하다. 게다가 권한도 명확해야 하고, 변화에 대한 기록도 분명하게 해줘야 하는 거다보니 더욱 명확하게 파악해야 한다. 그런 면에서 함수형 도입은 분명히 필요하다.

 리팩토링을 하려고 하는 코드는 전형적인 과거 자바 스타일 코드들이다. 솔직히 로직이 안 보인다. 너무나 많은 예외 처리들이 존재한다. 좀더 객체지향적으로 구조 개선을 하든가, 한 눈에 보이도록 함수형으로 개선하던가 해야 한다. 그런 면에서는 개인적으로 함수형이 더 나은 것 같다. 객체지향은 좋긴 한데, 뭔가 명확하게 흐름을 파악하기에는 문제가 많은 것 같다. 물론 설계 미스였겠지만.

 인상깊은 부분은 스칼라의 try/success/failure를 함수형으로 구현한 부분이었다. 솔직히 왜 나는 이런 부분을 생각하지 않았을까 싶었고, 스칼라가 해당 기능을 JVM에서 돌리기 위해 비슷한 형태로 내부 구현한 게 아닐까 하는 생각마저 들었다. 물론 이게 진실이라고 생각진 않는다. 이 부분은 실제 구현된 부분을 확인해봐야 알 수 있는 내용이겠지만.

 제일 많이 쓰고자 하는 건 역시나 Optional이다. 너무 명확해서 뭐라 말하기가 어렵다. 이걸 쓰고 안 쓰고는 확실히 차이가 나는 게, 정신이 아찔할 정도로 if 절을 남발할 수밖에 없는 상황을 반전시킬 수 있는 키 피처 중 하나다. 스트림과 Optional, 이 둘만 적절히 정리해줘도 지금보다는 확실히 낫다.

 느긋한 계산법 (지연 평가), 이걸 제대로 몰랐던 건데, 설명을 아주 잘 해준다. 게다가 저자가 다년 간 일하면서 알게 된 주옥같은 가이드나 팁, 경험 공유는 무척이나 값지다. 기술 설명하는 것보다, 이런 내용들이 오히려 저자가 하고 싶었던 내용이 아닌가 싶다.

 재귀 부분은 일반적으로 아는 정도로만 알고 있었는데, 새로운 관점을 알게 해줬다. 눈이 번쩍했다.

함수형 디자인 패턴과 자바를 위한 함수형 접근 방식은 한 번만 읽어서는 안 될 내용이다. 이 내용은 여러 번 읽어서 전달하고자 하는 내용을 체화해야 할 것들이다. 단순한 내용도 아니고 쉬운 내용도 아니다. 이것들을 내것으로 만들 수만 있어도 한 번의 빅 점프를 할 수 있다는 생각이 들었다.

 저자는 독학으로 개발자가 되었다고 했다. 본인은 전산학을 전공했지만, 솔직히 저자만큼의 지식을 쌓았다는 생각이 들지 않는다. 역시 배움에는 끝이 없고, 읽어야 할 책은 매년 쏟아져 나온다. 그래서 할 일은 전혀 줄지 않았다. 그래서 흥미로운 세계가 바로 프로그래밍이 아닐까?

이 책은 자바 개발자들을 대상으로 한 함수형 프로그래밍의 핵심 개념과 적용 방법에 대한 포괄적인 안내서로, 객체 지향적인 사고 방식을 넘어서 함수형 프로그래밍의 강력한 장점을 이해하고 활용할 수 있도록 돕습니다.

함수형 프로그래밍은 고수준의 추상화와 불변성, 효율적인 병렬 처리 등의 장점을 제공하여 복잡한 애플리케이션과 시스템 개발에 특히 효과적입니다. 자바 8에서 소개된 람다 표현식과 스트림 API는 자바에서 함수형 프로그래밍의 출발점이 되었으며, 이러한 기능을 통해 대규모 데이터 처리와 분산 시스템 개발에 쉽게 적용할 수 있습니다.

함수형 프로그래밍의 이해: 함수형 프로그래밍의 핵심 개념부터 시작하여, 불변성, 고차 함수, 순수 함수 등 함수형 프로그래밍의 기본 개념을 자세히 다룹니다. 이를 통해 독자들은 함수형 프로그래밍의 철학과 장단점을 이해할 수 있습니다.

자바의 함수형 프로그래밍 기능: 자바 8부터 도입된 람다 표현식과 스트림 API, 그리고 자바 9부터 추가된 모듈 시스템과 같은 기능들을 통해 함수형 프로그래밍을 어떻게 자바에서 구현할 수 있는지를 설명합니다. 또한, 자바 14에서 추가된 레코드 클래스와 같은 최신 기능들도 소개됩니다.

실전 예제와 실무 적용: 각각의 개념을 이해하기 쉽게 설명하기 위해 다양한 예제 코드와 함께 제시됩니다. 또한, 이러한 개념들을 현실의 프로젝트에 적용하는 방법에 대한 실제 사례와 적용 전략도 다룹니다.

디자인 패턴과 리팩터링: 자바로 작성된 기존 프로젝트를 함수형 프로그래밍의 원리에 따라 리팩터링하는 방법에 대해 상세히 설명합니다. 함수형 프로그래밍의 특성을 활용하여 코드의 가독성과 유지보수성을 향상시키는 방법을 다양한 예제를 통해 소개합니다.

자바 생태계와 함수형 프로그래밍: 자바 이외의 다른 언어에서 사용되는 함수형 프로그래밍의 기법과 자바에서의 적용 방법을 비교하고 분석합니다. 또한, 자바에서 함수형 프로그래밍이 어떻게 발전해 왔는지에 대한 개괄적인 역사적 개요도 제공합니다.

이 책은 함수형 프로그래밍에 대한 이해를 넓히고, 자바 개발자들이 현업에서 보다 효과적으로 함수형 프로그래밍을 활용할 수 있는 능력을 갖추도록 돕는데 중점을 두고 있습니다. 따라서 자바 개발을 좀 더 깊이 있게 이해하고, 현업에서 더 나은 소프트웨어를 개발하고자 하는 모든 개발자들에게 권장되는 도서로 평가될 것입니다.

 

프라모델과 레고를 같이 다루어야 하는 상황이라면 대충 감을 잡을 수 있으리라 생각합니다.


정해진 부품을 잘 다듬어 가며 조립하는 프라모델 같은 객체 지향과

기초 블록만으로 모든 것을 만들 수 있지만 한땀한땀 조립해야 하는 레고 블록 같은 함수형 프로그램.

설계와 분해가 공존하는 세상에 오신 걸 환영합니다.


함수형 프로그래밍이 전혀 생소하지는 않습니다만, 한번 읽고 모두 이해하신 분들이 부러울 따름입니다.

옆에 두고 수시로 들춰보며 생각 방식을 해체하고 조립하기를 반복해야 할 듯 보입니다.


세계관

세계관이 충돌이라고 할 수 있습니다만, 앞으로 나아가는 방향으로 생각한다면,

세계관 통합이라고 말할 수 있을 것 같습니다. 세계관 공유라고 해도 좋구요.


객체 지향 세상을 이끈 걸출한 자바가,

더욱 복잡해지고 세분화하는 세상에서 도전에 맞닥뜨리고 있는 현장을 보고 계십니다.

조금 느리지만 객체 지향을 디디고 있으면서 어떻게 함수형 프로그래밍을 받아들이고 있는지 볼 수 있습니다.


자바의 향기

자바를 사용하면 알게 모르게 익숙해지는 것 가운데 하나가 보일러플레이트입니다.

속도를 올리는 방식 가운데 하나인 익숙함을 사용하고 있습니다.

보일러플레이트처럼 각 장을 구성하고 있습니다.


먼저 문제를 펼쳐놓고, 무엇을, 어떻게 접근하려는지 알려줍니다.

그런 다음 목표로 삼은 문제에 대응하거나 개선하는 방식을 풀어나갑니다.

그리고, 어디에나 있고 놓치면 헤매기 쉬운 주의사항을 알려줍니다.

마지막으로 요약하며 생각과 내용을 정리합니다.


중요한 건 뭐다?

불변성!

프로그래밍하는 방식이 바뀌고 있습니다.

주어진 자원을 아끼고 최대한 활용하는 방향에서,

의도치 않은 오류와 사이드 이펙트에서 벗어나는 방향으로.

너무나 많은 예외와 다양한 상황에 대응하느라 지쳤다고 할까요.


행복한 경로까지는 아니더라도 중요한 부분에 집중하려면

무엇보다 불변성이 있어야 한다고 수시로 강조합니다.

 

 

익숙한 내용, 처음 보는 내용, 이렇게까지 해야 할까 의구심이 드는 내용 등

자바에서 함수형 프로그래밍을 어떻게 다루어야 하는지 알려주는 좋은 길잡이라고 생각합니다.


책에서 인용하고 있는 문구 두 개가 이 책이 지향하는 바를 알려줍니다.

먼저 작동하게 만들라. 그다음 올바르게 수정하고, 마지막으로 빠르게 만들어라.

 

함수형 프로그래머가 되지 마세요.
객체 지향 프로그래머가 되지 마세요.
더 나은 프로그래머가 되세요.

 

 

결과를 만들자, 도구는 거들뿐.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 

“한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”
 

JDK 8 부터 사용이 가능한 람다 표현식을 실제로 많이 사용하고 있지만, 함수형 프로그래밍에 대해서는 깊이 있는 공부를 하거나 많은 고민을 해보진 않았었다. 이 책 한권만으로 함수형 프로그램에 대한 지식이 해박해진다거나 하는 일은 없다. 

다만, 자바에서 조금 더 좋은 코드를 만들기 위해 고려할 수 있는 옵션을 하나 더 늘려나가기에는 충분하다고 생각된다.

 

책에서는 자바라는 언어에서 함수형 프로그래밍에 어떻게 접근했는 지를 알게 해주면서 상황에 맞게 사용할 수 있는 방법을 알려준다.

함수형 인터페이스나 함수를 합성하는 방법 등을 가볍게 알려주는 데, 이런 부분들은 실무에도 쉽게 적용하며 재미있게 코딩해볼 수 있을 거라고 생각된다.

 

파트 2에서는 개발하면서 고민해봤을 법한 불변성이나 스트림 처리, 스트림을 활용한 병렬처리, null 처리, 예외 처리 등에 대해 이해하기 쉽게 다룬다. 또한, Java 14 부터 사용 가능한 레코드에 대해 자세히 소개하며 사용 사례까지 알려주기 때문에 금방 익숙해질 수 있다.

 

이해가 어려울 만한 부분들에서는 적절히 그림을 통해 이해를 돕고 있다.

책의 후반부에는 디자인 패턴을 함수형으로 구현한 예제나 자바를 위한 함수형 접근 방식에 대해 자세히 이야기하여 함수형 사고방식을 기르는 데 도움을 주고 있다

 

전반적으로 책의 내용이 알차고 예제와 그림도 적절히 추가되어 있어 금방 읽어보기 좋은 책이라고 생각한다. 물론, 쉽지 않은 개념이기에 책을 읽는 다고 바로 능숙하게 함수형 패러다임을 적용할 수는 없겠지만, 책의 예제를 따라해보고 실제 프로젝트에 조금씩 적용해볼 수 있는 길잡이가 될 수 있는 책이라고 생각한다.

자바로 익히는 함수형 프로그래밍의 기초

 

 

사실 함수형 프로그래밍 자체는 범위가 매우 넓고, 제대로 이해하기 위해서는 많은 개념들을 학습해야 한다. 하지만 프로그래밍 언어를 사용하는 개발자 입장에서 그런것들을 모두 완벽하게 파악하고 어찌 개발을 할 것인가...  그래서 개발을 할 때 함수형 프로그래밍에서 제시하는 모든 개념에 대해 응용을 하면서까지 개발을 진행하지는 않을 것이다.

자바의 함수형 프로그래밍 역시 마찬가지다. 자바 8에서 함수형 프로그래밍을 할 수 있도록 언어 자체가 굉장히 많이 버전업이 되었다. 이 때 개발자가 함수형 프로그래밍에 대해서 전부를 알 필요 없이 많은 것들을 추상화 하고 사용하기 쉽도록 언어적 차원에서 제공하게끔 변경되었고, 심지어 함수형 프로그래밍의 규칙을 벗어난 듯한 문법도 제공하게 되어 개발자가 함수형 프로그래밍을 쉽고 빠르게 프로덕션 레벨 수준에서 이용할 수 있게 되었다.

그런 차원에서 혹시나도 자바를 사용하지만 함수형 프로그래밍에 대해서 접하지 못한 사람들에게 이 책은 도움이 된다.

 

 

책은 개인적으로 크게 3파트로 구성되는 것 같다. 

1. 함수형 프로그래밍에 대한 개괄

2. 자바에서의 함수형 프로그래밍

3. 자바에서 추가된 다른 기능들(Optional, CompletableFuture)

우선 책의 앞 파트에서는 함수형 프로그래밍에서 사용되는 용어에 대해서 설명하고 있다. 함수형 프로그래밍이 최신의 기법은 절대 아니고 예전에 존재하던 개념인데 해당 패러다임을 사용하면 어떠한 장점이 있는지에 대해서 알 수 있고, 또한 내부적으로 사용하는 단어에 대해서도 알 수 있다. 

개인적으로 해당 파트가 지루하다면 바로 파트 2로 넘어가서 자바에서 함수형 프로그래밍을 어떻게 적용하고 있는지 확인해보는 것이 좋을 것 같다.

 

 

파트 2부터는 본격적으로 자바에서 어떤식으로 함수형 프로그매잉을 적용하는지에 대해서 설명한다. 그림과 코드를 같이 제공하여 해당 코드가 어떠한 방식으로 동작하는지에 대해서 쉽게 파악할 수 있을 것이다.

 

 

그 이외에 자바 8부터 추가적으로 제공하는 기능들에 대해서 설명한다. 이 때 이러한 기능들이 함수형 프로그래밍식으로 코드를 작성할 수 있는데, 그 중에서도 Optional이 있다. 사실 자바에서 널 체크를 하는 부분이 어떻게 보면 굉장히 성가시고, 심지어 프로덕션 레벨에서 빼먹고 처리를 못하는 경우도 있지만, 해당 기능을 유용하게 잘 활용하면 안정적인 코드를 작성할 수 있다.

위 Optional도 마찬가지로 map, filter와 같은 함수형 프로그래밍에서 사용되는 기법을 사용할 수 있으므로 좀 더 깔끔한 코드를 작성할 수 있다.

 

 

특히 비동기 작업에서 Future만 제공하던 방식에서 CompleatableFuture을 자바 8에서 제공함으로써 함수형 프로그래밍 방식으로 비동기 작업을 깔끔하게 진행할 수 있게 되었는데 위 기능도 빠짐없이 설명하였다.

 

 

이 책은 철처하게 함수형 프로그래밍에 대한 개괄과, 자바에서 함수형 프로그래밍을 어떻게 적용하고 있는지에 대해서 설명하고 있다. 함수형 프로그래밍에 대해서 처음 접하거나, 자바에서 함수형 프로그래밍을 적용시키는 것을 알고 싶은 사람들에게 추천한다.

혹시나 자바 코드를 어떻게 잘 작성하는지에 대해서 알아보려면 모던 자바 인 액션 굉장히 추천한다. 이 책에서도 역시 함수형 프로그래밍에 대한 내용이 적혀 있으므로 해당 내용 확인해보면 매우 좋을 것이다.

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.


 

2014년 자바 8에서 람다 표현식과 스트림 API가 나왔습니다.
이로 인해 자바에서는 자바 8부터 함수형 프로그래밍의 시작되었다고 할 수 있습니다.

 

하지만 대부분 사람들이 람다, 스트림등 많은 기능들이 있다는 것은 알지만 어느 상황에 사용해야 하는지는 잘 모릅니다.

하지만 개발자는 상황에 따라 패러다임과 적합한 도구들을 선택하는 경우가 생기기 마련이죠.

 

저자는 위와 같은 상황에 대한 다양한 선택을 할 수 있게

언어를 함수형으로 만드는 다양한 개념들과 스트림, Optional, Com-pletableFuture와 같은 기능들에

대해 자세하게 설명해주고 있습니다.

그래서 개발자 입장에서 오류발생 가능성을 줄여주고, 더 간결하고 합리적인 코드를 작성하게 도와주며

다양한 상황에 더 합리적인 코드 사용할 수 있도록 도와주고 있습니다.

 

따라서 이 책은 자바에 대해 어느 정도 익숙하고 함수형 프로그래밍에 대해 알고는 있지만

어디에 어떻게 사용하는지 잘 모르시는 분들, 혹은 효율적으로 코드를 리팩터링 하고 싶은 분들,

백엔드 개발자와 자바 개발자 분들에게 추천드리고 싶습니다.

 

위 내용은 "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

[BOOK] 함수형 프로그래밍 with 자바 - 벤 바이디히 지음 / 허귀영 옮김

 

 

부제: "함수형 프로그래밍을 적용하여 객체 지향 자바 코드 향상시키기"

 

개발자는 항상 깔끔하고 더 간결한 코드를 추구해야 합니다. - p. 51

 

패러다임의 변화를 따라가는 것은 쉬운 일이 아닙니다. JAVA가 세상에 알려진 초기에는 C처럼 코딩하는 개발자도 (많이) 있었습니다. JVM에서 동작해야하니 JAVA로 개발했는데 손에 익은 프로그래밍 언어가 C라서 절차적인 방식으로 만들었던거죠. 언어를 사용하는 개발자에게도 힘든일이지만 패러다임의 변화를 수용해야하는 프로그래밍 언어 입장에서도 힘든 일입니다. 새로운 패러다임을 지원하면서도 기존 패러다임과의 호환을 유지해야하니까요. 이 책에서는 패러다임 변화에 대응하는 방법도 엿볼 수 있습니다.

 

"함수형 프로그래밍 with 자바"는 함수형 프로그래밍에 대한 기초적인 설명과 JAVA에서 함수형 프로그래밍을 할 수 있도록 추가된 기능들을 설명합니다. 새로 추가된 기능이 하위 호환을 위해 어떻게 구성되어 있는지, JAVA의 기본 원칙을 지키면서 함수형 프로그래밍 기능을 제공하기 위해 어떤 고민을 했는지를 살펴볼 수 있습니다.

 

함수형 원칙은 많은 객체 지향 디자인 패턴에서 필수적인 보일러플레이트 코드를 제거할 수 있는 가능성을 제공합니다. - p. 484

 

이 책을 읽으려면 JAVA의 기본 문법은 알고 있어야 합니다. JAVA 8버전 이후에 추가된 문법을 알면 이해가 쉽습니다.  함수형 프로그래밍에 대해서는 책에서 기초부터 다루기 때문에 함수형 프로그래밍을 처음 접하더라도 문제 없습니다. 다만, 객체 지향과 함수형 프로그래밍에 대한 내용을 알고 있으면 책을 더 재미있게 읽을 수 있습니다. JAVA를 시작으로 Scala, Kotlin 등의 JVM 기반 함수형 프로그래밍을 경험해 보는 것도 좋겠네요.


"한빛미디어 [나는 리뷰어다] 활동을 위해서 책을 제공받아 작성된 서평입니다."

‘나는리뷰어다2024’ 서평단 멤버로 선정되어 이번 달에는 “함수형 프로그래밍 with 자바” 리뷰를 작성하게 되었습니다.

 

함수형 프로그래밍 with 자바 책은 자바 8 이후의 기능을 활용하여 함수형 프로그래밍을 자바에서 어떻게 적용할 수 있는지를 다룹니다. 자바가 객체지향 언어임에도 불구하고, 이 책은 함수형 프로그래밍의 접근법 중 하나로 자바를 사용하는 방법을 제시합니다.

저자는 자바에서 제공하는 기능인 람다 표현식과 스트림을 통해 함수형 프로그래밍의 개념을 설명하고, 이를 실제 코드로 어떻게 구현하는지를 쉽게 이해할 수 있도록 안내합니다. 특히 자바스크립트에서 익숙한 익명 함수를 자바에서 어떻게 활용하는지에 대한 예제도 제공됩니다.

자바 언어는 OOP 객체지향언어로 함수형 패러다임에 익숙하지 않은 언어 중 하나입니다. 그렇지만 자바 8 이후부터 람다 표현식이 추가되고 자바 언어에서도 함수형 프로그래밍할 수 있었습니다.

그러나 이 책이 “모던 자바 인 액션” 책과 다르게 함수형 프로그래밍을 다룬다는 점을 명심해야 합니다. “함수형 프로그래밍 with 자바”는 자바 언어의 기능을 중심으로 함수형 프로그래밍을 학습하고자 하는 분들에게 적합합니다. 따라서 자바를 이미 잘 알고 있는 개발자에게도 유용한 참고서가 될 것입니다.

만약 자바를 처음 배우거나 함수형 프로그래밍을 자세히 이해하고자 하는 경우라면 이 책을 적극 추천합니다.

“한빛미디어 활동을 위해서 책을 제공받아 작성된 서평입니다.”

이 책에 쓰여 있는 내용들은 언젠가 실무에서 반드시 대면하게 될 내용들이다. 다만, 그것을 글로 체감하는 것과 경험을 한 후, 책을 통해 얻는 깊이는 다를 것이다.

요즘 필자가 회사 업무를 담당하며 대면한 문제는 바로 모든 객체의 독립된 성격을 보존하는 동시에 가독력이 보장된 프로젝트를 만드는 것이다.

솔직히 업무를 혼자 하는 것이라면 코드의 규칙이나 아키텍처가 어찌 되었건 결과적으로 돌아가는 무엇인가만 나오면 된다.
확장이 가능한 느슨한 구조? 대략적인 인터페이스만 잘 뽑았다면 나중에 적당히 틀만 맞추면 되는 일이다.

인프라 확장? MQTT를 비롯한 분산 구조로만 대략적으로 구성하면 되는 문제다.

하지만, 협업의 관점에서 누군가가 내 코드를 봤을 때 혼란의 여지가 없고, 혹 실수를 하더라도 그 영향력을 최소화하는 프로그램을 구성한다는 것은 대단히 어렵고 쉽지 않은 이야기이다.

그런 관점에서 이번에 리뷰를 진행한 함수형 프로그래밍 책은 누군가 추후 내 손을 떠난 이 프로젝트를 건들 때, 혹은 같이 협업을 하며 복잡한 로직을 누군가 살펴볼 때, 혼란의 여지를 줄이고 코드의 가독력과 생산력을 향상시키는 팁들과 관련 기술들을 묶은 훌륭한 책이라 할 수 있다.


【책의 구성】 "함수형 프로그래밍 with 자바"의 구성은?

본 서를 공부하기 좋았던 이유는 샘플 코드가 많다는 것이었다.

저자가 충분히 글로써 친절히 설명하려 노력한 부분이 다수 보이나, 솔직히 코드를 설명하는 것은 코드를 보여주는 것만큼 훌륭한 접근법은 없다. 이 책은 글뿐만 아니라 예가 되는 샘플 코드들을 다수 채용하여 독자에게 제공하고 있기 때문에, 애매한 부분 없이 확실히 이해하는 데에 큰 어려움이 없었다.

또한, 실무에서 대면할 법한 어려운 문제들에 대해서도 저자의 생각과 고찰이 적절히 이 책에 녹아들어 있기 때문에, 주니어와 시니어 사이를 달리는 중니어들이 이 책을 본다면 많은 것을 얻을 수 있을 것이라 생각된다.

솔직히 너무 주니어들은 이 책을 읽어도 아~ 이런 게 있구나 정도이지 않을까 싶긴 하다.

 



챕터 1 : 함수형 프로그래밍 소개

거의 대부분의 책이 그렇듯. 이 책도 처음 챕터는 함수형 프로그래밍이 무엇인지. 함수형 프로그래밍이 지향하는 바가 무엇인지에 대해서 설명하고 있다.

모든 법이 헌법에 그 근간을 두었듯, 모든 학문에 있어서 그 학문이 탄생하게 된 배경을 아는 것은 중요하다. 그렇기에 꼭 해당 챕터를 꼼꼼히 읽어두도록 하자.

함수형 프로그래밍은 무엇일까? 간단하다.

순수하며, 일관되며, 간결된 이 삼박자를 갖추면 그것이 함수형 프로그래밍이다. (간추려 정리하자면..)

 



챕터 5 : 레코드

이 장은 레코드 타입에 대해서 설명하고 있다.

솔직히 POJO나 JavaBean이나 그 등장 배경은 코드를 많은 사람들이 보았을 때 통일성을 갖추게 하기 위함에 있다. 이 말이 무엇인고하면 A라는 객체가 있으면 그 A라는 객체는 중간에 변조 없이 A라는 객체의 본연의 역할 그 자체에 충실하면 된다는 것이다.

하지만, 앞서 언급한 POJO든 JavaBean이 든 그 역할을 함에 있어서 아쉬운 부분이 많이 있었다. 중간에 변조가 발생할 수 있는 setter를 허용한다거나 보일러 플레이트 코드를 구성하기 위해 객체 정의의 상당 부분을 해당 코드로 낭비하는 등이 그것이다.

하지만 modern java에서 지원해 주는 record라는 타입은 그러한 단점을 극복하고 보다 독립화된 객체를 쉽게 구성하는 데에 초점을 둔 타입이라 할 수 있다.

필자가 10년 넘게 웹서비스 회사에서 일해보았지만, 아직 레코드 타입은 대중화가 안된 것 같긴 하다. 왜냐하면 대부분의 코드가 아직도 POJO나 JavaBean과 같이 옛날 형식 그대로 여전히 이어져 내려오고 있기 때문이다.

아마 프로젝트가 오래되었거나, 아니면 이전 방식에 익숙한 다수의 개발자들에 의해 프로젝트가 시작되었기 때문이리라...

【 함수형 프로그래밍 with 자바를 읽고 나서 】

필자는 그동안 프로그래밍의 관점을 크게 객체지향적이냐 아니면 절차 지향적이냐 이 두 가지 분류로 나누곤 했는데, 이 책을 읽으며 객체지향적이건 절차 지향적이건 가장 중요한 관점은 다수가 코드를 보았을 때, 코드 하나하나의 역할이 확실히 정해져 있고, 중간에 변조가 없어 해당 객체 하나만으로도 그 룰이 충분히 정해지는 그런 코드가 협업에 있어서 중요하다는 것이었다.

물론 협업을 하더라도 본인이 담당한 영역에 다른 사람이 손을 대는 일이 거의 없다면 위의 관점에서 프로그램을 구성하는 것은 낭비일 수 있다. 왜냐하면 어차피 내 코드는 나만 담당하고 나만 보는데, 어찌 프로그램을 짜든 무슨 상관이란 말인가?

하지만 위와 같은 자세는 상당히 위험하다. 왜냐하면 누군가 꼭 보기 때문에 코드의 역할을 잘 세분화하고 가독성 있게 짜야 하는 것이 아니기 때문이다.

옛말에 이런 말이 있다. '보기 좋은 떡이 먹기도 좋다.' 그렇다. 코드도 '보기 좋은 코드가 퍼포먼스, 코드 확장에 있어서도 용이하다.' 즉, 각 객체의 역할을 각 객체 본연의 성격에 맞게 잘 구성하고 코드의 가동력이 뛰어나며 이와 동시에 각 구간이 독립적으로 잘 추상화되어있는 프로젝트 그것이 바로 '보기 좋은 떡'에 해당하는 것이다.

이제는 나름 규모가 있는 프로젝트는 혼자 하기엔 그 허들이 높아진 시대라 할 수 있다. 옛날 같으면 일인 개발자다 뭐다 해서 금방 금방 프로덕트를 뽑아냈지만, 지금은 조금 규모가 있다 싶은 프로젝트들은 어느 정도 개발자들을 모아 협업 없이는 만들 수 없는 시대가 되었기 때문이다. (아.. 물론 언젠가 이 부분을 AI가 대신해 줄 것이라 생각되지만..)

따라서 협업의 관점에서 프로그램을 만들 줄 아는 능력. 이것이야말로 진정한 시니어로 거듭나는 지름길이라 할 수 있다.

본 도서는 "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

리뷰

자바를 거의 1년간 배웠고 이제는 제법 익숙한 언어가 되었습니다. 람다, stream, optional 등등 함수형 프로그래밍을 어느정도는 알고 있었지만 조금 더 배워보고 싶어서 이 책을 리뷰하게 되었습니다.


책은 함수형 프로그래밍이 무엇인지부터 함수형 인터페이스, JDK에서 지원하는 함수형 인터페이스, stream, optional, 레코드 등등의 개념을 다룹니다. 레코드까지는 기본적으로 자바 프로그래머가 이미 알고있는 내용들을 복습하는 느낌이었습니다. 왜 불변성이 중요한지. Single Abstract Method 등 함수형 인터페이스가 되는 조건 등등에 대하여 설명합니다. 다만 당연하게 넘어갔던 것을 다시 한번 왜 그런지 생각해보고 넘어갈 수 있었던 시간이었습니다.


이후에 레코드, 스트림부터는 중요한 기능등을 다양한 예제를 통해 공부할 수 있었습니다. 그냥 학습하는 것이 아니라 어떻게 하면 더 좋은 코드를 만들 수 있는지 생각하며 학습할 수 있습니다. 생각보다 난이도가 꽤나 있어서 읽는데 시간이 오래걸렸습니다. 단순한 개념만 얻어간 것이 아니라 개념 + 노하우를 배울 수 있던 시간이었습니다.

 

누구에게 추천하는가

이미 자바를 익숙하게 다룰줄 아는 사람. 어느정도 람다, 스트림, 함수형 인터페이스, 제네릭 등등을 알고 이해할 수 있는 사람.
이런 분들이라면 해당 책을 재밌게 읽고 자신의 실력을 더 발전시킬 수 있다고 생각합니다.

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."


 

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

 

모던한 언어들의 대세에 따라 함수형 프로그래밍이 떠오르면서 'Java 에서의 함수형 프로그래밍' 에 대해서도 적지 않은 관심이 있다. Java 가 지원하는 함수형 인터페이스와 스트림은 이미 널리 쓰이고 있고 이는 Java 언어를 사용하는 개발자라면 익숙한 내용들이다. 이 책은 이것에서 한발 더 나아가 함수형 프로그래밍이란 무엇이고 Java 는 그것을 어떻게 지원하는지, 사용은 어떻게 하고 무엇을 조심해야 하는지 생각하게끔 한다.

 

이 책은 Java 에서 함수형 프로그래밍 패러다임을 다루기 위한 기법으로 함수형 인터페이스, 레코드 타입, 스트림, 병렬 스트림, 그리고 옵셔널에 대해서 상세하게 다룬다. 단순히 문법에 대한 설명 뿐만 아니라 레코드 타입의 등장 배경, 옵셔널을 잘 사용하는 방법 등 예시와 구현들을 상당히 상세하게 설명하고 있다.

나오는 키워드들이 초보가 보기에 가볍지 않은 만큼 이 책을 보기 위해 상속, 구현 등 Java 8 까지 포함된 기본 문법들은 당연히 잘 알아야 한다. 컬렉션, 제네릭, 제네릭 메소드 그리고 나아가 Java 가 동시성 프로그래밍을 다루는 법에 대해서도 미리 알고 있다면 이 책을 흥미롭게 볼 것이다.

 

이제 책 속으로 뛰어들 준비는 됐다. '함수형 프로그래밍 with 자바' 는 크게 두 개의 파트로 나눠져있다. 첫번째는 함수형 프로그래밍 패러다임에 대한 소개와 Java 가 어떤 과정을 통해 이 패러다임에 합류하게 됐는지에 대한 설명이다. 두번째는 객체지향과 명령형 프로그래밍 언어인 Java 를 가지고 어떻게 함수형 패러다임을 접목할 수 있는지 기술적인 설명이다.

첫번째 파트에서 함수형 프로그래밍 패러다임을 소개하면서  명령형 프로그래밍을 하는 자바 개발자들을 놀라지 않게 잘 달래준다. 이 책에 관심을 갖고 서평을 볼 정도면 잘 알고 있을 '무엇' 과 '어떻게' 에 대한 접근을 바탕으로 참조 투명성, 불변성, 일급 객체, 함수 합성, Currying function, Lazy evaluation 이 무엇인지 소개한다.

 

막연하게 알고 있는 함수형 인터페이스 원형인 Function, Consumer, Supplier, Predicate 에 대해서 당연히 용법에 대해서 설명한다. 하지만 대게는 자바가 이렇게 많은 함수형 인터페이스를 가져야 하는 이유에 대해 명쾌한 해석이 없는것에 비해 이 책에서는 Lambda 대수의 개념 설명을 바탕으로 Java 에서 람다 표현을 취급하기 위해 일급 객체가 되어야 하고 그렇기 때문에 인터페이스가 단일 추상 메소드 (Single Abstract Method) 를 가져야 한다고 설명한다. 여기까지 이야기가 나오면 당연하지만 람다 표현식의 변화된 참조에 대해서도 설명한다.

 

두번째 파트로 가면 첫번째 파트의 함수형 프로그래밍의 개요에서 설명했던 Java 의 함수형 프로그래밍 기법에 대해 더 자세하게 설명한다. Java 가 불변성을 지원하기 위해 사용하는 Unmodifiable collection, final 키워드, record 타입에 대한 설명도 있다.

 

재미있었던 부분은 Java 는 python 같이 동적 언어들과 달리 Tuple 컬렉션 이 없다. 그래서 Tuple 자료를 다루기 위해  Map < Integer, List < String > > 따위의 상당히 번거로운 자료구조를 만들어야 한다. 강타입인 Java 언어의 특성상 선언은 어쩔수없이 해야하지만, 이 자료구조를 처리하기 위한 코드는 가만히 생각해봐도 번잡스럽기 마련이다. 이 책에서는 함수형 인터페이스의 선언과 스트림의 메소드 체이닝을 적절히 활용해 생각만해도 복잡한 코드를 어떻게 명시적으로 만드는지 예시를 보여준다. 궁금하면 서점에 가서 p.166 페이지를 보길 바란다.

 

보통 스트림에 대해서 설명하면 map, filter, reduce 3개의 연산 타입이나 생성, 중간연산, 최종연산에 대해 간소하게 나오지만 이 책에서는 마블 다이어그램을 기반으로 각 연산 메소드가 어떻게 작동하는지, Spliterator 인터페이스의 특성에 따라 어떻게 병렬 처리를 하는지, 병렬 처리를 할 때 주의해야 할 점은 무엇인지 상세하게 설명한다.

 

약간 부록의 느낌으로 생각했던 CompletableFuture에 대한 파트도 있다. Java의 비동기 처리를 위한 CompletableFuture 역시 작업을 선언하고 실행하고 결과를 수집하는 함수형 프로그래밍으로 작성된다. 때문에 간략한 문법에 대한 설명만 있을거라 생각했는데 생각보다 비동기 처리에 대한 저자의 고찰이 잘 녹아있어서 흥미롭게 읽었던 부분이였다.

그 외에도 책에서는 다양한 JVM 기법들을 통해 Java 가 함수형 프로그래밍을 지원한다고 설명한다. 일일이 다 적을순 없지만

 

- 선언형 프로그래밍으로 작성된 코드는 언제 실행되고 결과가 결정되는지 (invokedynamic)
- 높은 아리티의 함수형 인터페이스는 무엇이 있는지 (BiFunctional)
- 자바에서의 함수 합성은 구체적으로 어떻게 이뤄지는지 (Glue method)
- 람다에서 예외를 어떻게 다루는지 (Try 타입)

 

위 내용을 포함해 상당히 생각 해볼법한 내용이 많이 등장하기 때문에 함수형 프로그래밍 패러다임에 딱히 관심이 없더라도, Java 와 JVM 에 대해서 관심이 많은 사람이라면 꼭 한번 읽어보면 좋겠다는 생각을 한다.


 

 

함수형 프로그래밍 with 자바입니다.

자바를 공부하고 개발하면서 함수형 프로그래밍을 들어보신적이 있으신가요? 저는 들어본적은있지만 실제로 공부하고 사용하지는 않았는데요. 하지만 무의식적으로 이게 함수형 프로그래밍이 몰랐을 뿐이지 조금씩은 쓰고 있었습니다. 람다 표현, 스트림, 레코드, Optional도 실제로 토이프로젝트에서 사용하고 있었는데요. 함수형 프로그래밍을 쓰기 위해서는 이런 기본적이면서도 실제로 자주 사용하는 타입 및 데이터 처리를 조금은 알아야 합니다. 이런 표현식은 개인적으로는 자주 사용하는 표현식인데요. 저는 이게 처음에는 함수형 프로그래밍이다라고 사용해본적은 없지만 이 책을 읽고 나서 함수형 프로그래밍적으로 개발을 하고 있었으며 조금이나마 왜 함수형 프로그래밍으로 개발하는지 이해가 되었습니다.

레코드같은 경우 완전히 lombok을 대체하기는 힘들겠지만 그래도 함수형 프로그래밍적으로 생각해서 나온 클래스 타입입니다.

lombok도 사용하지 않으면서 불변적인 POJO를 만드려면 수십줄의 코드가 필요한데 레코드는 수줄이면 끝날정도로 간단합니다.

이렇게 Java진형에서도 점점 더 함수형 프로그래밍적으로 생각하며, 개발하고 출시하며 그 시작은 개인적으로 유명한 람다식이라고 생각이 됩니다. Java8부터 시작한 개발자라만 누구나 알아야 한다고 생각이 될 정도로 유명한데 막상 개발을 하다보면 익숙하지 않아서 람다식으로 개발하지 않는 개발자가 많습니다. 저 역시 생각나면 사용하지만 리펙토링 할 때 IDE의 도움으로 람다식으로 조금씩 수정을 하는 편인데요. 함수형 프로그래밍 with 자바를 읽으면서 좀 더 람다식 그리고 스트림을 어떻게 자연스럽게 사용하는지 배울 수 있었습니다.

실무에서 접해볼일이 많이 없기에 블로그나 인강으로만 조금씩 공부했는데 함수형 프로그래밍에 대해서 좀 더 자세하게 공부하니 장점과 단점이 보이면서 제가 토이 프로젝트에서도 활용할 수 있겠다는 생각이 들었습니다.

 

 

 

 

함수형 프로그래밍은 어렵습니다. 자주 사용하면서도 모르게 사용하고 또는 함수형 프로그래밍을 알지만 그냥 무의식적으로 사용하는 개발자도 많은데요.(저처럼...) 함수형 프로그래밍의 기본적인 이해와 함께 자바에서 많이 사용하는 람다, 스트림, Optional등 이번에 조금이나마 활용할 수 있는 방법도 공부했습니다.

단지 도서의 난이도는 있는편입니다. 자바를 어느정도 공부했더라도 실무에서 접하지 않았거나, 람다와 스트림에 대한 사용방법등을 모르면 도서를 이해하는데 조금은 어려울 수 있습니다. 왜 사용하는지도 모를 수 있는데요. 하지만 조금이라도 사용해 보았고 좀 더 활용할 수 있는 방법을 찾는다면 좋은 도서가 될거라고 생각이 됩니다.

함수형 프로그래밍은 최근에 나온 요소가 아니기에 한번이라도 이해가 된다면 앞으로 다양한 언어 혹은 개발할때 많은 도움을 줄 수 있을거라고 생각됩니다.

 

한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.

함수형 프로그래밍을 자바로 배우고 싶다면 이 책으로 공부하세요

함수형 프로그래밍 기초부터 람다, 스트림, 자바로 구현 가능한 함수형 프로그래밍 기법들과 비동기 프로그래밍 까지 

최신 자바로 가능한 함수형 프로그래밍의 모든 것을 배울 수 있습니다 ~


 

총평

- 책의 난이도 : ★★★★

- 추천 별점     : ★★★★

- 추천 독자     :  자바를 이미 어느정도 사용하고 알고있는 개발자 중 함수형 프로그래밍을 적용해보고 싶은 분

- 지은이          : 벤 바이디히 지음 / 허귀영 옮김

- 출판사          : 한빛미디어


 

말그대로 자바를 이용한 함수형 프로그래밍을 어떻게 적용할 것인지를 다루는 책입니다. 자바는 기본적으로 객체지향형 프로그래밍을 지향하고 있습니다. 다만 이는 병렬 처리를 통한 소프트웨어의 수평 확장이 쉽지 않습니다. 만약 문제가 간단하고 서로 관련이 없는 하위 문제로 분할할 수 있는 경우 병렬 처리가 훨씬 효과적입니다. 이 경우 함수형 프로그래밍이 유용하게 사용될 수 있습니다.

 

이 책을 통해서 저자는 언어를 함수형으로 만드는 다양한 개념들과 JDK에서 제공하는 도구 또는 직접 생성한 도구들을 사용해 자바 코드에 결합하는 방법을 중점으로 설명합니다.

 

 

책의 내용

1부에서는 함수형 프로그램이의 핵심 개념과 역사, 자바에서 구현 하는 방법을 배워봅니다.

2부에서는 함수형 원칙에 대해서 알아보고 레코드와 스트림 등의 주요 기능을 예제를 통해 학습합니다.

 

좀 더 구체적인 내용은 다음과 같습니다.

1장. 함수형 프로그래밍 소개 - 함수형 프로그래밍이 무엇인지, 여기서 쓰이는 개념인 불변성, 재귀 등을 학습합니다.

2장. 함수형 자바 - 람다 문법과 구성, 익명 클래스, 람다 생성 및 호출 방법 등을 학습합니다.

3장. JDK 함수형 인터페이스 - Function, Consumer, Supplier, Predicate 이 4가지 인터페이스를 학습하고, 함수 합성이나 확장 등을 알아봅니다.

4장. 불변성 - 불변성 상태는 무엇인지를 알아보고 직접 만들어봅니다.

5장. 레코드 - 데이터 유형으로 튜플이나 POJO를 만들어봅니다. 레코드의 내부 동작과 특징에 대해서 상새하게 알아보고 다양한 사례를 통해 학습합니다.

6장. 스트림을 이용한 데이터 처리 - 함수형 데이터 파이프라인으로써의 스트림의 특성을 알아보고 파이프라인을 구축해봅니다.

7장. 스트림 사용하기 - 원시 / 반복 /무한 스트림이 무엇인지 알아보고 배열에서 스트림으로 변경하는 것을 알아봅니다. 저수준 스트림을 생성해보고 다양하게 사용해봅니다. JMH를 통해서 스트림 성능을 측정하는 것 등을 학습합니다.

8장. 스트림을 활용한 병렬 데이터 처리 - 병렬 스트림에 대해서 알아보고 활용해보며 주의할 점은 무엇인지 학습해봅니다.

9장. Optional을 사용한 null 처리 - null 참조에 대해서 알아보고 Optional이 무엇인지 알아봅니다.

10장. 함수형 예외 처리 - try-catch블록에 대해 알아보고 람다에서 체크 에외 함수형으로 예외를 다뤄봅니다.

11장. 느긋한 계산법(지연평가)  - 자바의 구조에 대해서 알아보고 람다와 고차 함수 등을 통해서 다양한 접근 방식을 확인해봅니다.

12장. 재귀 - 재귀에 대해서 알아보고 다양한 예시를 학습합니다.

13장. 비동기 작업 - 비동기 파이프라인을 구축해보고, 스레드 풀에 대한 개념을 알아봅니다.

14장. 함수형 디자인 패턴 - 함수형 디자인 패턴인 팩토리 / 데코레이션 / 전략 / 빌더 등의 패턴을 알아봅니다.

15장. 자바를 위한 함수형 접근 방식 - 함수형 아키텍처를 알아보고 어떤식으로 구성해야하는지 학습해봅니다.

 

 

 

책의 구성

- Note등을 통해서 부가 설명이 잘되어 있고, 키워드는 색깔 및 블러 처리로 정리가 용이하게 되어있습니다.

 

 

- 각 장의 마지막에는 핵심 요약이 있어서 학습 내용을 확인해 볼 수 있습니다.

 

 

 

이상으로 도서 리뷰를 마치겠습니다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

객체지향에 익숙한 기존 개발자나 언어에 어느정도 익숙한 자바 개발자가 함수형 프로그래밍에 접근하기 위해 시작하기 좋은 책인것 같다. PART 01은 차분히 읽고, 나머지는 관심 있는 부분 위주로 읽어도 괜찮겠다. 

 

책 내용 중에 이런 말이 있다. “함수형 프로그래밍은 특정 언어 자체가 아닌 사고방식입니다”. 

일단 불변성부터 조금씩 시작해봐야겠다. 

결제하기
• 문화비 소득공제 가능
• 배송료 : 2,000원배송료란?

배송료 안내

  • 20,000원 이상 구매시 도서 배송 무료
  • 브론즈, 실버, 골드회원이 주문하신 경우 무료배송

무료배송 상품을 포함하여 주문하신 경우에는 구매금액에 관계없이 무료로 배송해 드립니다.

닫기

리뷰쓰기

닫기
* 상품명 :
함수형 프로그래밍 with 자바
* 제목 :
* 별점평가
* 내용 :

* 리뷰 작성시 유의사항

글이나 이미지/사진 저작권 등 다른 사람의 권리를 침해하거나 명예를 훼손하는 게시물은 이용약관 및 관련법률에 의해 제재를 받을 수 있습니다.

1. 특히 뉴스/언론사 기사를 전문 또는 부분적으로 '허락없이' 갖고 와서는 안됩니다 (출처를 밝히는 경우에도 안됨).
2. 저작권자의 허락을 받지 않은 콘텐츠의 무단 사용은 저작권자의 권리를 침해하는 행위로, 이에 대한 법적 책임을 지게 될 수 있습니다.

오탈자 등록

닫기
* 도서명 :
함수형 프로그래밍 with 자바
* 구분 :
* 상품 버전
종이책 PDF ePub
* 페이지 :
* 위치정보 :
* 내용 :

도서 인증

닫기
도서명*
함수형 프로그래밍 with 자바
구입처*
구입일*
부가기호*
부가기호 안내

* 온라인 또는 오프라인 서점에서 구입한 도서를 인증하면 마일리지 500점을 드립니다.

* 도서인증은 일 3권, 월 10권, 년 50권으로 제한되며 절판도서, eBook 등 일부 도서는 인증이 제한됩니다.

* 구입하지 않고, 허위로 도서 인증을 한 것으로 판단되면 웹사이트 이용이 제한될 수 있습니다.

닫기

해당 상품을 장바구니에 담았습니다.이미 장바구니에 추가된 상품입니다.
장바구니로 이동하시겠습니까?

자료실

최근 본 상품1