일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Storm
- Spring Batch
- hadoop
- 인텔리J
- Spring XD
- 제주
- design pattern
- apache storm
- 스프링 배치
- hibernate
- Spring
- DDD
- docker
- Java
- hdfs
- intellij
- scala
- Hbase
- Linux
- elastic search
- 도메인주도설계
- Spring Boot
- spark
- elasticsearch
- 엘라스틱서치
- SBT
- Gradle
- Clean Code
- Angular2
- nginx
- Today
- Total
욱'S 노트
함수형 프로그래밍이란 (Kotlin 함수형 프로그래밍 #1) 본문
개요
프로그래밍의 패러다임은 세가지가 있다.
- 명령형 프로그래밍 혹은 절차식 프로그래밍(Imperative Programming)
- 객체지향 프로그래밍(Objective Programming)
- 함수형 프로그래밍(Functional Programming)
왜 함수형 프로그래밍이 등장하게 되었을까? 간단한게 말하자면 함수형 프로그래밍은 명령형 프로그래밍의 대안이다. 나같은 경우도 객체지향과 함수형 프로그래밍을 혼합해서 사용한다. 프로그램을 역할을 나눌 때는 객체지향으로 로직을 전개할 때는 함수형 프로그래밍을 사용하는 편이다.
명령형 프로그래밍은 지시를 하나하나 내리는 방식을 의미한다. 지시를 수행함으로써 시스템의 상태가 변경된다. 하지만 시스템이 커질수록 코드에 대한 추론이 어려워지고 복잡성이 증가하며 테스트가 어렵다는 단점이 있다.
부수효과
부수효과 즉 Side Effect란 함수내에서 구현이 함수 외부에 영향을 끼치는 경우를 의미한다. 부수효과를 예를 들자면 다음과 같다.
- 결과를 반화하는 것 외에 무언가 다른 일을 하는 함수
- 블록 외부 영역에 변수를 변경
- 파일 읽기 쓰기. 메모리의 내용 변경. 콘솔 출력 및 사용자 입력을 읽는다.
- 외부에서 전달된 객체 필드를 변경
- 예외를 던지거나 예외를 발생시키면서 프로그램 중단
부수효과를 처음 접하면 함수형 프로그래밍에서는 어떠한 제약이 있는 것 처럼 느껴질 수 있다. 하지만 함수형 프로그래밍은 어떻게 작성하는지를 제한할 뿐 무엇을 할 수 있는지에 대한 제한은 없다. 부수효과 없이 IO수행, 오류처리, 데이터변경을 할 수 있다. 이건 나중에 알게 된다.
순수함수
순수함수는 부수효과가 없는 함수를 의미한다. 즉 함수가 주어진 입력에 대한 결과를 계산하는 것외에 다른 행위를 하지 않는다는 것을 의미한다.
아래는 부수효과가 있는 함수는 아래와 같다. 신용카드의 상태가 변경 되며, 실제로 비용을 청구한다면 테스트는 어려워진다.
class Cafe {
fun buyCoffee(cc: CreditCard): Coffee {
val cup = Coffee() // <1>
cc.charge(cup.price) // <2>
return cup // <3>
}
}
청구금액을 처리하거나 거래내역을 영속화하거나 비용 청구에 대한 관심사를 다른곳에서 처리하도록 한다. Charge의 생성과 처리나 해석을 분리하자. 나중에는 효과가 발생하지만 추가적인 함수적인 해법을 배울것이다.
class Cafe {
fun buyCoffee(cc: CreditCard): Pair<Coffee, Charge> {
val cup = Coffee()
return Pair(cup, Charge(cc, cup.price))
}
}
참조 투명성, 순수성, 치환 모델
참조 투명성(Referential Transparency)은 수행하는 모든 일이 함수의 반환값으로 표현되어야 한다는 의미한다. 이런 제약을 도입하면 치환 모델(Substitution)을 통해 자연스럽고 단순하게 프로그램의 평가에 대한 추론이 가능해진다. 치환 모델은 각 부분을 완전히 전개한 다음 변수를 그 변수가 가리키는 대상으로 치환 했을때 등치 관계를 사용한 추론을 가능해져서 방정식과 비슷해진다.
순수성 개념을 형식화 하면 함수형 프로그래밍이 더 모듈적인 이유에 대해 감을 잡을 수 있다. 코드를 이해하기 위해 지역적 추론만으로 충분하다. 또한 각 함수들이 순수하면 합성 가능하다.
요약
- 순수함수는 부수효과가 없는 블랙박스이다.
- 다시 말해 치환모델로 논리적 추론이 가능한 참조 투명성을 가진 함수이다.
- 더 모듈적이며 합성가능하여 재사용성이 높아진다.
- 테스트도 쉽다.
'Methdology > Functional Programming' 카테고리의 다른 글
불변 데이터/Immutable Data (Kotlin 함수형 프로그래밍 #2) (0) | 2025.01.09 |
---|