Yunseok's Dev Blog

배운 것을 적는 블로그입니다.

코드숨 함수형 자바스크립트 스터디 회고

코드숨에서 4주동안 함수형 자바스크립트 책 스터디를 했다.

무엇? 왜? 어떻게?

우리가 이번 스터디를 마치면, 알아야 할 개념들에 대해서

  • 무엇인가?
  • 왜 사용하는가?
  • 그래서 어떻게 사용하는가?

에 대해서 정리를 하면서 스터디를 진행했다.

함수형 프로그래밍이 사람들이 말하는 것들이 조금씩 달라서 정리하기가 굉장히 어려웠는데, 그러면 그럴수록 위와 같은 질문들이 도움이 됐다. 핵심적인 부분들을 골라내는 데 있어서 굉장히 유용했다. 예를들어 함수형 프로그래밍에 대해서 다음과 같이 정리했다.

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

* 순수함수로 프로그래밍을 하는 것
* 함수로 기능을 추상화해서 프로그래밍 하는 것
* 이미 입증된 함수로 새로운 함수로 만들어서 프로그래밍 하는 것
* 상태변이를 최소화하면서 프로그래밍하는 것

## 함수형 프로그래밍을 왜 해야할까?

* 복잡한 코드를 간결하게 분리할 수 있다.
* 선언적으로 할 수 있다.
* 테스트가 용이하다.
* 더 안전하게 프로그래밍할 수 있다.
* 순수한 순수하지 않은 부분을 명확하게 나눌 수 있다.

정교화

우리가 배운 것들을 그래서 어디다 써먹을 수 있을까? 이런 고민들을 굉장히 많이 해봤다. 내가 그냥 아무 생각 없이 작성한 함수들에 대해서 함수형으로 코드를 작성한다면 어떻게 될까? 이미 작성한 코드들에 대해서도 이 코드들을 함수형으로 작성한다면 어떻게 될까? 같은 고민을 많이 했다.

image

코드 리뷰를 하다가 이걸 Maybe를 사용해서 문제를 해결하면 어떨까?하여 코드도 짜보고 코드 리뷰도 남겨봤다. 이렇게 적용했던 경험도 사람들에게 공유했다.

Either에 대해서는 아직 이해를 못 해서 아쉬운데, 다시 공부해서 적용해봐야겠다.

예제 만들기

어떻게 사용하는가는 사실 말로 설명하기에는 굉장히 어렵다. 그래서 예제를 만들어봤다. 예르들어 꼬리 호출 최적화가 되어 있지 않은 재귀 프로그램에 대해서 꼬리 호출 최적화를 해봤다.

// 재귀
const sum = (numbers) => {
  if (numbers.isEmpty()) {
    return 0;
  }

  // 1 + sum[2,3,4,5] => 스택에 넣어놓음 
  // 1 + 2 + sum[3,4,5] => 스택에 넣어놓음
  return first(numbers) + sum(drop(numbers));
}

// 꼬리 재귀 => 반복문으로 변경 가능 => 반복문으로
const sum = (numbers, sum = 0) => {
  if (numbers.isEmpty()) {
    return sum;
  }

  // sum([2,3,4,5], 0 + 1)
  // 스택이 2개 => 콜스택 터짐이 없다.
  return sum(drop(numbers), sum + first(numbers));
}

예제를 만들 수 없다면 완벽하게 이해한 것이 아니다. 이러한 피드백을 통해 학습에 대한 척도를 정할 수 있어서 굉장히 좋았다. 내가 아직 함수형 사고를 완벽히 이해하지 못한 것 같다. 사람들이 쉽게 이해할 수 있는 예제를 만들 수 있어야 할 것 같다.

실제로 함수형 프로그래밍을 실무에 적용할 수 있을까?

적용할 수 없을 것 같다. 진입장벽이 너무 높아서 팀원들이 모두 함수형 프로그래밍에 대해 학습하고 습득해야 하는데 실질적으로 적용하기는 어려울 것 같다. 함수형 프로그래밍 맛만 보는 정도로 그치는 것 같아 아쉽다.

Sources

  • 질문 정리 - https://github.com/CodeSoom/functional-javascript
  • 함수형 자바스크립트 - 교부문고 - http://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9791162240427ㅏ