2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[item 46] Stream과 함수형 프로그래밍 #135

Open NuhGnod opened 1 year ago

NuhGnod commented 1 year ago

p.277 첫 문단에서 스트림은 그저 또 하나의 API가 아닌, 함수형 프로그래밍에 기초한 패러다임이기 때문이다. 라고 말합니다. 그리고, 코드 46-1의 문제점으로 람다가 상태를 수정함(freq.merge) 라고 말하고 있습니다.


저는 궁금한 것이 왜 스트림이 함수형 프로그래밍에 기초한 패러다임 이라고 말하는 지 입니다.

공식 문서 에도 우선 함수형 프로그래밍의 원칙을 따른다. 또는 기초했다 라는 언급은 없긴합니다.

자바에서 함수형 프로그래밍 패러다임을 적용하기 위해 Stream이 도입된 것 정도는 이해가 됩니다. 그리고 많은 관련성이 있기도 합니다.

스트림이 함수형 프로그래밍에 기초한 패러다임

이라고 말하는 것을 어떻게 이해하면 좋을까요?

gmelon commented 1 year ago

헷갈리긴 하지만 제 생각과 찾은 내용들을 말씀드리겠습니다.

우선 함수형 프로그래밍은 아래와 같은 특징들을 가집니다.

순수 함수

1급 객체, 고차 함수

선언형

// 선언형 List names = List.of("a", "b", "c"); List newNames = names.stream() // 원소들이 무슨 일을 할지 선언 .filter(name -> !name.contains("a")) .collect(Collectors.toList());



> 저는 프로그래밍언어개론 수업 때도 그렇고 명령형 <-> 선언형 의 차이점 이부분이 항상 헷갈렸는데 명령형은 해당 코드가 있는 부분에서 당장 명령한 일을 수동적으로 수행하지만, 스트림으로 작성하면 원소들이 당장 일을 하는게 아니고 자기가 필요할 때 (예를 들면 종단 연산이 수행될 때) 선언한 일을 수행하게 된다는 점이 차이점이 아닐까? 이번에 생각하게 됐습니다.

본론으로 돌아와서, 왜 스트림이 함수형 프로그래밍 패러다임을 따른다고 할 수 있는가? 를 생각해보면 우선 제 생각은 이렇습니다.

자바의 람다는 위에서 말한 함수형 프로그래밍 언어에서의 '함수' 를 만들 수 있도록 지원해줍니다. 람다로 만든 인스턴스가 인자로 전달되거나 순수 함수가 아닐 경우 경고를 띄워주는 등의 작업을 해줘서 그렇다고 생각합니다. 그리고 스트림은 이 특정한 일을 수행하는 람다들을 인자로 받아 원소를 조작합니다.

그래서 결론적으로는 람다를 사용하는 스트림이 함수형 패러다임을 따른다고 하는게 아닐까 하는 생각입니다. 제 생각 + 검색 결과의 조합이라 저도 확실하게는 말씀드리기가 어렵네요. 다시 얘기해보면 좋을 것 같아요.

아 그리고 Stream 클래스 api 문서에는 아래와 같이 함수형 스타일의 프로그래밍을 지원하는 클래스라는 설명이 있긴 하더라구요.
<img width="1176" alt="image" src="https://github.com/2023-java-study/book-study/assets/33623106/96965c90-81a3-444c-987b-591cee4fbd68">