Skip to content

6.1 함수형 프로그래밍이란 무엇인가?

Donam Kim edited this page Sep 19, 2016 · 2 revisions

수학 함수

함수는 부수 효과가 없다

  • 함수(또는 식)이 부수효과가 없다는 함수 내부에서 다른 전역 상태를 일체 변경하지 않는다.
  • 부수 효과가 없다 == 순수하다

순수 함수가 주는 장점

주변환경에 영향을 받지 않는 순수성으로 인해 분석, 테스트, 디버깅이 쉬워진다.

참조 투명성

  • 순수성은 참조 투명성을 낳음
  • 참조 투명성의 두가지 특성
    • 함수를 아무곳에서나 호출할 수 있고 주변환경에 상관없이 항상 같은 방식으로 동작한다.
    • 어떤 식이 두 번이상 반복되면 처음 식을 계산해서 얻은 결과로 반복된 식을 안전하게 치환할 수 있다.

일급 계층

  • 함수는 일급 계층이다.
  • 참조 추명성의 두 번째 특성을 생각해보면됨

고차 함수

  • 다른 함수를 인자로 받는 함수
  • 함수를 리턴하는 함수
  • e.g. 컬렉션의 map

값이 바뀌지 않는 변수

  • 순서 중심 프로그램에서는 변수는 변할 수 있음
  • FP에서는 변수의 값이 변하지 않는다.
    • 스칼라에서는 변수는 var로 정의하고 변경 가능함
    • val로 정의한 """값"""이 변하지 않음
  • FP에도 상태가 존재: 새로운 인스턴스나 새로운 스택 프레임(함수 호출과 반환값)으로 표현
    • factorial 예제의 accumulator가 상태
def factorial(i: Int): Long = {
  def fact(i: Int, accumulator: Long): Long = {
    if (i <= 1) accumulator
    else fact(i - 1, i * accumulator)
  }
    
  fact(i, 1L)
}

(0 to 5) foreach ( i => println(factorial(i)) )
  • 불변성은 동시성을 사용해서 규모 확장이 가능한 코드를 작성할 때 크게 도움이 된다.
    • 멀티스레드 프로그래밍에서는 공유된 변경 가능한 상태에 대한 접근을 동기화 하는것이 어려움
    • 불변값 + 참조 투명성이 규모 확장 가능한 프로그래밍을 쉽게 해줌
  • 복잡성을 다루기 쉬워짐
    • 고차 순수 함수 == combinator
    • 함수들이 레고 블록처럼 잘 조합될 수 있음
  • 순수 함수와 불변성은 버그가 발생하는 빈도를 극적으로 감소시켜준다.
    • 순수성
      • 객체지행 코드에 필요한 여러 방어적 준비 코드를 제거할 수 있음 -> 설계의 단순화
    • 변경 불가능한 데이터 구조
      • 상태 변화로 인한 대부분의 문제가 사라짐
      • 상태 변경을 원할땐느 복사를 해야함
        • 함수형 데이터 구조를 사용하면 두 복사본 사이에 변가 없는 부분을 공유하는 방식을 사용해서 오버헤드를 줄임
  • 스칼라의 스트림 타입과 같은 지연 계산을 통해 성능 향상을 꾀할 수 있다.
    • 스칼라는 기본적으로는 미리 계산(eager evaluation) 방식을 사용
    • 지연 계산을 기본으로 사용하지 않는 이유?
      • 지연 계산이 효율적이지 못한 경우가 많이 있고
      • 지연 계산의 성능을 예측하는 것이 어렵기 때문
Clone this wiki locally