함수형 프로그래밍과 부수효과

김민재·2023년 1월 10일
0

객체지향과 함수형의 차이

  • 객체지향: 움직이는 부분 캡슐화하여 코드 이해 돕고
  • 함수: 움직이는 부분 최소화하여 코드 이해를 돕는다

함수형 프로그래밍에선 함수도 중요하기에 보통 값과 다르지 않기 때문에 인자로 넘기거나 리턴할 수 있는 일급 객체 취급

부수효과

  • 사전적 의미의 부수효과, Side Effect 부작용, 부과적으로 설명된 동작을 더 강조하기 위해 부작용이라고 불림
  • 프로그래밍 관점에선 즉, 값을 반환하는 것 외에 부수적으로 일으키는 효과(side effect)
  • 변수나상태를 바꾸거나 수정
  • 화면이나 파일에 데이터를 쓰는 IO작업
  • 다른 부수효과가 있는 함수나 상태 값에 의존
    이는 기계와 저수준에 최적화된 명령형 방식이다

합성을 어렵게 만드는 부수효과

  • 변화하는 상태 모두 기억
  • 코드 실행 순서, 횟수, 분기에 따라 결과 달라짐
  • 여기에 비동기 병렬처리, 전역 상태까지 더해지면 더 복잡
    -> 코드를 이해하고 결과를 예측하기 불가능

순수함수

프로그램을 작게 쪼개기
하나의 메인 프로그램과 부 프로그램, 서브루틴 그리고 함수

  • 함수형 프로그래밍에서 함수는 주어진 입력에 대하여 계산을 하고 리턴하기 만할 분 부수효과는 없다
  • 즉, 똑같은 매개 변수(입력)을 받으면 항상 같은 값을 반환하는 함수를 의미
  • 수학적의미의 함수와 동일해 증명 가능하고 안전하다
  • 순서나 실행 횟수 상관없이 항상 예측 가능한 결과 반환

따라서 함수형 프로그래밍에선 작은 함수를 합성하여 복잡한 프로그램을 만들어낸다.

함수형 프로그래밍에서 부수효과 다루기

  • for, while 구문은 상태를 변경하고 불변성을 위반
  • 상태가 변하여 복잡해서 실수하기 쉬우며 합성하기 어렵다
function sum_1_to_100(){
let sum = 0;
  for(let i = 1; i<=100; i++){
  sum += i
  }0
  return sum
}
  • 순수하지만 장황한 재귀 함수를 이용해서 보통해결
  • 순수한 함수이긴 하지만 복잡하다
    function sum_1_to_100(){
    	function go(sum, i){
      	if(i>100){
        return sum
        }
        return go(sum +1, i+1)
      }
      return go(0,1)
    }

console.log(sum_1_to_100())

일반화된 방식으로 추상화

반복가능한 자료구조를 추상화된 함수 활용하면 순수하고 선언적으로 합성 쉬워짐

효과를 안전하게 추상화하기

요약

  • 함수를 합성해 복잡한 프로그램 쉽게 만들기
  • 부수효과를 공통적 방법 추상화, 이에 대한 방법으로 펑터와 모나드같은 수학적이론 뒷받침

    업로드중..
profile
자기 신뢰의 힘을 믿고 실천하는 개발자가 되고자합니다.

0개의 댓글