-
Notifications
You must be signed in to change notification settings - Fork 7
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) 방식을 사용
- 지연 계산을 기본으로 사용하지 않는 이유?
- 지연 계산이 효율적이지 못한 경우가 많이 있고
- 지연 계산의 성능을 예측하는 것이 어렵기 때문