<What about Funtional Coding? -1탄 함수형 코딩 입문- >

강민수·2022년 12월 21일
0
post-thumbnail

1. Intro

  • Long time no see?

어느 덧 프론트 엔드 개발자로 일해온 지 6개월이 넘어선 시점.

그동안, 회사 적응과 회사일이 바쁘다는 핑계로...

블로그 게재를 미뤄왔던 거 같습니다.. ㅜㅜ

그래서 이번 함수형 프로그래밍 시리즈를 시작으로 하나씩 계속 연재해 볼 생각입니다.

이번 함수형 코딩은 바로

함수형 코딩이라는 이 책의 내용이 기본적인 내용이 될 것 입니다.

기본적으로 책의 목차와 내용을 토대로 정리하면서 필자의 생각과 견해를 함께 녹여보면서 정리해 볼 생각입니다. 글이 얼마나 길어질 지는 모르겠으나, 최대한 챕터 단위로 쪼개서 진행해 보겠습니다.

Chapter 01. 함수형 사고부터 해 보자!

책에서는 먼저, 우리가 함수형 코딩이나 프로그래밍을 하기 이전에, 함수형 사고부터 해보도록 안내합니다.

01. 함수형 프로그래밍의 정의.

함수형 프로그래밍은 사전적으로 다음과 같이 정의 됩니다.

함수형 프로그래밍(Functional Programming, FP, 명사)
1. 수학함수를 사용하고 부수효과를 피하는 것이 특징인 프로그래밍 패러다임.
2. 부수효과 없이 순수함수만 사용하는 프로그래밍 스타일.

앞선, 정의는 다음과 같지만, 여기서 주목해야 할 부분은 크게 두 가지다.

02. 부수 효과?

먼저 부수 효과. 흔히 말하는 사이드 이펙트라고 불리는 이 용어는 흔히들 많이 들어보았을 것 입니다.

부수효과는 함수가 리턴값 이외에 하는 모든 일을 말합니다. 예를 들어, 이메일 보내기, 파일 읽기, 불빛을 깜빡이기 등과 같은 것들을 예시로 들 수 있습니다.

이러한 부수효과들은 함수를 부를 때마다 발생하기 때문에 때로는 문제가 될 수 있습니다. 즉, 사용자는 리턴 값만 필요해서 함수를 불렀지만 의도치 않게 다른 효과도 발생하게 되는 경우가 있는 것이죠. 그래서 대부분의 함수형 프로그래머는 이런 불필요한 부수 효과를 가능한 사용하지 않으려고 합니다.

03. 순수 함수?

다음은 순수 함수입니다. 순수함수는 인자에만 의존하고 부수효과가 없는 함수입니다. 인자에만 의존한다는 말은 결국 같은 인자를 넣으면, 같은 결과를 도출한다는 뜻 입니다. 그래서 보통 수학에서의 함수와 비슷하게 동작한다고 해서 보통 순수 함수를 수학 함수라고도 부릅니다.

따라서 이런 순수함수를 다루기 쉽고 이해하기 쉽기 때문에 프로그래밍 입장에서도 중요하게 생각합니다.

하지만, 과연 부수효과는 절대 없고, 순수함수만으로 프로그래밍이 가능할까요?

정답은 NO!

실질적으로 프로그래머는 실제로 부수효과와 순수하지 않은 비순수 함수 역시 사용합니다.

그 이유는 뭘까요?

04. 함수형 프로그래밍에 대한 오해?

함수형 프로그래밍의 정의.
1. 수학 함수를 사용하고 부수 효과를 피하는 것이 특징인 프로그래밍 패러다임.
2. 부수 효과 없이 순수 함수만 사용하는 프로그래밍 스타일.

1. 부수 효과는 사실 필요하다!

사실 정의에 따르면, 함수형 프로그래밍은 부수 효과를 피해야 하지만, 부수 효과는 소프트웨어를 실행하는 이유입니다.

이메일 전송 프로그램이 이메일 전송을 하지 않으면 의미가 없겠죠?

그래서 사실 함수형 프로그래밍이 의미하는 부수 효과는 필요할 때는 딱 써야 합니다.

2. 부수 효과를 잘 다룰 수 있다?

정의에는 순수함수(=부수효과 없이 결과값이 인자에만 의존하는 함수)만 쓰라는 것처럼 보이지만, 사실 프로그래머들은 비순수 함수를 생각보다 많이 사용합니다. 그리고, 함수형 프로그래밍에는 이런 비순수 함수들을 잘 다루기 위한 기술들이 많이 있습니다.

3. 함수형 프로그래밍은 실용적입니다!

사실 정의만 봤을 때는 함수형 프로그래밍은 수학적이라 실제 소프트웨어 개발에서 사용하지 않는 것처럼 느껴집니다. 하지만, 함수형 프로그래밍을 기반으로 만들어진 소프트 웨어들은 생각보다 우리 주변에 많이 있습니다.

5. 함수형 프로그램의 핵심 3개념.

그렇다면, 우리가 여기서 살펴보아야 할 함수형 프로그래밍의 핵심 개념은 무엇일까요?

크게 액션, 계산, 데이터라는 3가지 개념을 들 수 있습니다.

1. 액션.

액션은 실행 시점이나, 횟수 또는 둘 다에 의존합니다. 긴급한 메일을 오늘 보내는 것과 내일 보내는 것은 완전히 다릅니다. 또 한 번만 보내는 것과 여러 번 보내는 것은 다릅니다.

액션에 해당하는 함수형 프로그래밍 도구
ex) 시간이 지남에 따라 안전하게 상태를 바꿀 수 있는 방법, 순서를 보장하는 방법, 액션이 정확히 한 번만 실행되게 보장하는 방법.

2. 계산.

계산은 입력값으로 출력 값을 만드는 것 입니다. 같은 입력값을 가지고 계산을 하는 데 다른 결과 값이 나오면 안 되겠죠. 따라서 계산은 같은 입력값은 항상 같은 결과 값을 보장하도록 하는 것 입니다. 또, 시간이나 장소에 따라서도 결과는 변하지 않습니다.

그렇다고, 결과가 다시 외부에 영향을 주지도 않습니다. 계산은 테스트하기 쉽고 언제든지 몇 번을 불러도 안전합니다.

계산에 해당하는 함수형 프로그래밍 도구
ex) 정확성을 위한 정적 분석, 소프트웨어에서 쓸 수 있는 수학적 지식, 테스트 전략.

3. 데이터

데이터는 이벤트에 대해 기록한 사실입니다. 즉, 데이터는 실행하느 코드만큼 복잡하지 않기에 다른 것과 구분합니다. 알아보기 쉽고, 실행하지 않아도 데이터 그 자체로 의미가 있습니다. 또 같은 데이터라고 하더라도 다양한 해석이 가능합니다.

데이터에 해당하는 함수형 프로그래밍 도구
ex) 효율적으로 접근하기 위해 데이터를 구성하는 방법, 데이터를 보관하기 위한 기술, 데이터를 이용해 중요한 것을 발견하는 원칙.

6. 액션과 계산 데이터를 구분하는 것에 대한 장점?

위의 개념을 사용하면서 얻는 대표적인 이점의 사례로 '분산 시스템'을 들 수 있습니다.

먼저, 분산 시스템의 3가지 규칙을 살펴보죠.

  1. 메시지 순서가 바뀔 수 있다.
  2. 메시지는 한 번 이상 도착할 수도 있고 도착하지 않을 수도 있다.
  3. 응답을 받지 못하면, 무슨 일이 생겼는 지 알 수 없다.

여러 컴퓨터가 네트워크 통신을 하다보면, 소프트 웨어는 복잡해집니다. 이때, 처리해야 할 메시지는 순서가 뒤섞일 수도 있고, 중복, 유실되기도 합니다. '시간에 따라 바뀌는 값을 모델링'할 때동작 방법을 이해하는 것은 중요하지만 쉽지 않습니다.

이런 면에서 데이터와 계산은 실행 시점이나 횟수에 의존하지 않습니다. 그래서 코드를 데이터와 계산으로 바꿀수록 분산 시스템에 생기는 여러가지 문제를 해결할 수 있습니다.

액션은 실행 시점과 횟수에 의존하기 때문에 여전히 문제가 되지만, 코드 전체에 영향을 주지 않도록 격리시키면 됩니다. 또 분산 시스템이 아무리 불확실성을 가지고 있다고 해도 액션을 안전하게 다룰 수 있는 기술이 있기 때문에 안심할 수 있습니다. 그리고 코드의 많은 부분을 액션에서 계산으로 옮기면 결과적으로 액션도 다루기 쉬워집니다.

7. 함수형 사고는 뭘까?

그렇다면 진정한 함수형 사고는 무엇일까요?

함수형 프로그래밍에는 다양한 주요 개념이 있습니다만, 대표적으로 가장 중요하다고 생각하는 2가지 개념을 소개합니다.

파트 I. 액션과 계산, 데이터.

앞서 말씀드린 것처럼, 함수형 프로그래머는 코드를 액션과 계산, 데이터로 구분합니다. 이러한 분류는 코드를 이해하고 테스트 및 재사용하는 것과 관련되어 있습니다. 이를 통해 향후 어떤 설계와 관점에서 액션과 계산, 데이터를 다루는 다양한 방식들에 대해서 살펴보겠습니다.

파트 II. 일급 추상.

대부분의 프로그래머는 재사용을 위해 조금 더 일반적인 함수 이름을 짓기 위해 고민합니다. 함수형 프로그래머도 똑같지만, 함수에 함수를 넘겨 더 많은 함수를 재사용합니다. 함수에 함수를 넘긴다는 말이 다소 어색할 수는 있지만 매우 실용적인 개념입니다. 이후 파트에서는 어떻게 하면 이런 함수들에 대한 사용법과 남용하지 않는 법에 대해 더 살펴보겠습니다.

8. 다음 파트로 넘어가기 전에...

이렇게 아주 대략적으로 함수형 프로그래밍에 대해 살펴봤습니다. 하지만, 이는 매우 적은 부분만 적어 놓았습니다. 따라서 향후, 앞서 언급한 함수형 프로그래밍 도서를 잘 참고해서 해당 내용을 저만의 언어로 잘 녹여보겠습니다.

그럼 다들 함수형 사고의 세계로 떠나 봅시다! ㅎㅎ

profile
개발도 예능처럼 재미지게~

0개의 댓글