블로그 이전했습니다. https://jeongzero.oopy.io/
함수형 프로그래밍이란?
본문 바로가기
프로그래밍 관련/이론

함수형 프로그래밍이란?

728x90

(맨 아래 참고자료 영상을 보고 나름 정리한 내용입니다.. 문제가 된다면 지울게여..) 

 

함수형 프로그래밍이란 뭘까나..

 

요즘 함수형 언어라고 자주 불리는 언어가 있다.  

 

함수형 언어란 어떤 언어에서도 적용할 수 있는 부분이다. 함수형 프로그래밍의 가장 중요한 개념은 side effect를 극단적으로 배제하는 형태의 프로그래밍을 하는 것이 함수형 프로그래밍이다. 

 

일반적으로 프로그래밍을 하다보면 반복적인 작업들을 하나로 묶어주는 일들이 많다. 예를 들어 프로그래밍에서 A에다가 2를 더하는 작업이 있다고 보자. 근데 다음에 또 2를 더하는 일이 생기면 그에 맞는 함수를 만들어서 그것들을 묶어주고 다음부터는 같은 코드 명려을 사용하지 않더라도 해당 함수를 콜하기만 해도 동작하게끔 하는 느낌인데  

 

그렇게 되면 필연적으로 함수 그자체의 본연의 기능이 아닌 코드를 묶어 놓는 어떤 코드 스코프 같은 느낌이 들때가 있다. 그러면 그 함수가 그 자체의 역할이 아니라 코드들을 묶어놓는 이너스코프 같은 형태로 기능을 하게되는 경우가 많다. 이런 경우에 나타낼 수 있는게 바로 side effect이다. 함수형 프로그래밍을 scope를 잘 지켜줘라 라는 의미가 가장 강하다 

 

프로그래밍을 여러가지 실행 영역들, 스포크가 섞여서 만들어지는데 그게 if나 while 같이 제어문이 될 수도 있고, 함수같이 별도의 실행영역을 갖는 스코프가 될 수도 있다. 그것들이 서로 엮혀서 유기적으로 관계하면서 결국 연산을 이끌어내는게 프로그래밍이다. 

 

하지만 함수형 언어는 그러게 하지 말라는 소리다. 즉 자기 영역에서 할 일을 자기 영역에서만 하라는 소리다. 

 

함수가 어트리뷰선을 받아서 그에 해당하는 결과값을 리턴을 해주는 이 본연의 기능에 집중을하라는 것이지, 결코 외부에 있는 요인들을 참조해서 그것들을 변화시키거나 그걸 활용해서 함수의 동작들을 결정짓지 말라는게 함수형 프로그래밍의 핵심이다 

 

단점 : 인간이 직관적으로 인지할 수 있는 코드가 되지는 않는다. 

 

 

함수형 프로그래밍의 개념

 

이해하기 쉽게 두가지 커피 공장이 있다고 하자 

 

<비 함수형 공장>
<함수형 공장>

 

먼저 비 함수형 공장을 방문해보자. 비 함수형 공장에는 많은 사람들이 역할을 나눠서 분주하게 일을 하고 있다 

  • 초록사람

    전반적인 프로세스 관리를 담당한다. 카카오가 들어오면 수량과 목표 생산량을 공지하고 각 직원들에게 업무를 배정해준다 

  • 주황사람

    로스팅 담당직원으로서 들여온 카카오 수량을 확인하고 카카오를 볶는다. 로스팅이 다되면 남은 시간을 표시해서 분쇄담당이 일을 준비할수 있게 해준다 

  • 파란사람

    시간을 확인하고 로스팅된 카카오를 분쇄기에 넣어서 진득한 카카오매스로 만들어낸다 

  • 빨간사람

    분쇄담당이 일을 마치면 당일 요구사항을 전달받고 각 종류의 초콜릿을 목표 생산량에 맞춰서 만들어낸다 

  • 분홍사람

    커팅 담당이다. 만들어진 초콜릿을 적당한 크기로 자르고 공장장한테 보고한다 

 

이러한 과정이 비함수형 공장에서 진행되는 프로세스이다. 해당 프로세스의 체계를 확립하기 위해서 설계자의 고민이 많이 들어갔을 것이다. 

 

 

이번에는 함수형 공장을 방문해보자 

 

 

  • 주황사람

    그냥 머가 들어온대로 로스팅해서 내보낸다 

  • 파랑사람

    그냥 구멍으로 들어온거를 다 갈아서 내보내기만 한다 

  • 초록사람

    그냥 카카오매스가 들어오면 초콜릿을 만들어서 내보낸다 

  • 분홍사람

    들어온 초콜릿을 그냥 자르는 일만 한다 

     

함수형 프로그래밍의 함수를 비유로 나타낸 이 친구들은 몇가지 뚜렷한 특징을 가지고 있다 

 

  1. 인풋과 아웃풋이 있다
  1. 외부 환경으로부터 철저히 독립적이다

    함수형 공장 사람들처럼 다른곳에 멀 적어두지도, 참조하지도 않는다. 

    오로지 자신들에게 주어진 것들로만 작업을 한다 

  1. 2번 특징에 의해서 같은 인풋에 있어서는 항상 동일한 아웃풋을 낸다. 외부 요인에 영향을 받지 않으니까, 철저히 들어오는 재료에 따른 결과물이 만들어지고 다른 직원들에대해서도 넘겨주는 결과물외에는 아무 영향을 주지 않는다

    =⇒ 이런걸 순수 함수라고 함 

 

비함수형 공장에서도 실수만 없다면 괜찮겠지만, 위의 사진의 파란 동그라미 같은 것들이 변수로 작용한다 

 

공장장이 적어놓은 숫자를 다른 외부인이 건드리거나, 적어두는 사람과 확인하고 수정하는 사람의 타이밍이 엇갈리거나 등등.. 이렇게 여러 함수이 손을 대는 외부 변수에 오류가 생기면 공장 프로세스에 차질이 생길수 밖에 없을 것이다 

 

함수형 프로그래밍이 주목받게 된 이유 중 하나가 바로 위와 같은 부작용으로부터 보다 자유롭다는 것이다. 여기서 말하는 부작용이란 맨 위쪽에서 말한 side effect를 뜻한다. 어떤 함수의 동작으로 인해 프로그램내의 상태가 변경되는 것을 의미한다 

 

💡
즉, 함수형 프로그래밍은 함수의 동작에 의한 변수의 부수적인 값 변경을 원천 배제함으로써 이런 종류의 오류들을 방지하는 것이다. 문제의 소지가 있는 일은 하지 않는 코딩 방식이다. 프로세서의 발전 속도가 사용자의 필요에 뒤쳐지면서 멀티코어의 멀티 프로세싱이 중요해진 오늘날 함수형 프로그래밍은 그래서 더더욱 주목받고 있다

 

 

함수형 프로그래밍의 대표적인 특징과 요소들

  1. 함수형 프로그래밍은 선언형이다

    내가 지금까지 공부해온 것들은 명령어 프로그래밍이다. 명령형 프로그래밍이란, 너는 이걸하고 너는 저걸 누구랑 이렇게 해서 이러이러한 결과를 산출해내라 ! 하는게 명령형으로 사고하는 것이다. 

    하지만 선언형은 이거는 이거다 ! 라고 생각하는 것이다. 순수 함수들은 인풋만 같으면  

    항상 같은 결과를 낼것이다. 따라서 즉 이거는 이거다 !라느 프로그래밍적 사고로 접근하는 것이다 

     

  1. 함수도 값이다

    이렇게 함수형으로 구성된 코드를 보면 number가 들어가는 인자, 거기에 대해서 동작하는 작업이 number*2 이다. 즉 숫자를 인자로 받으면 거기에 2를 곱해서 반환하는 일만을 하는 함수이다. 그럼 함수를 값으로 바라보서 멀 하려는 걸까? 

     

  1. 고계함수

    인풋이 있는 함수는 특정 값을 인자로 받는다. 함수를 값으로 볼 수있다면, 함수도 다른 함수의 인자로 넣을수 있을 것이다. 

     

     

    calc 함수를 보면 num1, num2, op 3가지 인자를 받고, op함수에 num1,num2 인자를 넣은 값을 반환한다. 즉 calc 함수의 3번쨰 인자는 함수를 인자로 받는단 소리이다. 

     

    그럼 add, multiply, power 라는 사칙연산 함수가 있으면 ,calc 함수의 3번째 인자에 원하는 연산에 대한 함수를 인자로 넣어주면 된다  

     

    이처럼 인자로 다른 함수를 받아 결과를 내보내는 함수를 고계함수라고 한다. 

    고계함수를 이용하면 더 유연하고 다채로운 프로그래밍이 가능해진다 

     

  1. 커링

    여러 인자를 받는 함수에 일부 인자만 넣어서 나머지 인자를 받는 다른 함수를 만들어내는 기법을 커링이라고 한다. 이러한 커링을 이용하면 인자들이 다 준비되지 않았을 때, 부분적용된 상태의 함수를 만들어내서 마련해두거나 다른 함수의 인자로 넘겨주는 등, 로직을 짜는 방식이 더 풍부해지고 코드량도 줄어들수 있다 

     

  1. 함수 컴비네이터

    컬렉션 내의 요소들을 다양하게, 연속적으로 처리할 수 있는 기능을 말한다. 

     

참고자료

728x90