Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 후니의 쉽게 쓴 시스코 네트워킹
- 알고리즘
- 에라토스테네스의 체
- 백준
- 투 포인터
- 시뮬레이션
- java
- Kotlin
- 유니온 파인드
- 스택
- 동적계획법
- Network
- 수학
- swea
- dfs
- 문자열
- 플로이드-와샬
- 그리디
- 구현
- Effective Java
- CS
- 백트래킹
- 위상정렬
- 세그먼트 트리
- JUnit 5
- 완전탐색
- 이분탐색
- 프로그래머스
- BFS
- mst
Archives
반갑습니다!
[Kotlin] 함수형 프로그래밍 본문
코틀린은 OOP(Object-Oriented Programming)와 FP(Functional Programming)을 모두 지원하는 다중 패러다임 언어이다.
함수형 프로그래밍
함수형 프로그래밍은 순수 함수를 조합해 상태 데이터 변경이나 부작용이 없는 루틴을 만들어내며 이름없는 함수 형태의 하나인 람다식을 사용해 함수를 변수처럼 매개변수, 인자, 반환값 등에 활용하는 고차 함수를 구성해 생산성을 높이는 프로그래밍 방법을 말한다.
순수 함수 (pure function)
순수 함수란 부작용이 없는 함수를 의미하는데, 여기서 부작용이 없다는 것은 동일한 입력 인자에 대해서 동일한 결과를 출력 또는 반환한다는 것이다. 즉, 멱등성을 지닌 함수를 순수 함수라고 한다.
예시를 보면서 알아보자.
fun add(a: Int, b: Int) = a + b
위의 함수는 동일한 인자에 대해서 항상 동일한 값을 반환하므로 순수 함수라고 할 수 있다.
이번엔 순수 함수가 아닌 경우를 예시를 통해 알아보자.
fun check() {
val test = User.grade() // check() 함수에 없는 외부의 User 객체 사용
if(test != null) process(test) // test는 User.grade()의 실행 결과에 따라 달라짐
}
위의 함수는 User.grade()의 결과에 따라 실행결과가 달라지기 때문에 순수 함수라고 할 수 없다. 또 다른 예시를 살펴보자.
const val c = 10
fun add(a: Int, b: Int) = a + b + c
이번 예시에서는 함수 외부에 있는 c에 의해서 결과가 달라질 수 있기 때문에 순수 함수가 아니다.
순수 함수는 왜 사용하는가?
- 입력과 내용을 분리해서 모듈화 하므로 재사용성이 증가함
- 특정 상태에 영향을 주지 않으므로 병행 작업 시 안전
- 함수의 값을 추적하고 예측할 수 있으므로 테스트, 디버깅 등에 유리
람다식 (Lambda Expression)
람다식이란 익명 함수의 형태 중 하나로, 이름 없이 사용할 수 있는 함수를 말한다. 람다식은 고차 함수에서 인자로 넘기거나 결과값으로 반환하는 등에 쓰인다.
val sum = {x: Int, y: Int -> x + y}
일급 객체 (First Class Citizen)
- 일급 객체는 함수의 인자로 전달할 수 있다.
- 일급 객체는 함수의 반환값에 사용할 수 있다.
- 일급 객체는 변수를 담을 수 있다.
위와 같은 특징을 갖는 객체를 일급 객체라고 한다. 코틀린에서는 함수를 일급 객체로 다루고, 이러한 함수를 일급 함수라고도 부른다.
고차 함수 (high-order function)
고차 함수란 다른 함수를 인자로 사용하거나 함수를 결과값으로 반환하는 함수를 말한다.
fun main() {
val a = 5
val b = 2
println("$a + $b = ${highOrderFunc({ a: Int, b: Int -> a + b }, a, b)}")
println("$a - $b = ${highOrderFunc({ a: Int, b: Int -> a - b }, a, b)}")
}
fun highOrderFunc(exp: (Int, Int) -> Int, a: Int, b: Int): Int {
return exp(a, b)
}
/**
* 실행 결과
* 5 + 2 = 7
* 5 - 2 = 3
*/
'Kotlin' 카테고리의 다른 글
[Kotlin] 반복문 (0) | 2020.06.15 |
---|---|
[Kotlin] 조건문 (0) | 2020.06.15 |
[Kotlin] 함수 (0) | 2020.06.09 |
[Kotlin] 비트 연산 (0) | 2020.06.08 |
[Kotlin] 자료형의 변환 (0) | 2020.06.03 |