코틀린은 다중 패러다임 언어
함수형 프로그래밍(FP : Functional Programming)
객체 지향 프로그래밍(OOP : Object-Oriented Programming)
함수형 프로그래밍
코드 간략, 테스트나 재사용성 증가
람다식, 고차 함수를 사용해 구성
순수 함수
함수를 여러 가지 조합 형태인 매개변수, 인자, 반환값으로 사용할 수 있다.
순수 함수 이해
부작용이 없는 함수
동일한 입력 인자에 대해서는 항상 같은 결과를 출력 혹은 반환 한다.
값이 예측이 가능해 결정적이다.
// 순수 함수의 예
fun sum ( a: Int, b: Int ) : Int {
return a + b // 동일한 인자인 a, b를 입력 받아 항상 a+b를 출력 ( 부작용이 없음 )
}
순수 함수의 조건
- 같은 인자에 대하여 항상 같은 값을 반환
- 함수 외부의 어떤 상태도 바꾸지 않는다.
순수함수가 아닌 것은?
fun Check() {
val test = User.grade() // check() 함수에 없는 외부의 User 객체를 사용
if (test != null) process(test) // 변수 test는 User.grade()의 실행 결과에 따라 달라짐
}
const val global = 10 // const 상수개념 전역변수
fun main() {
val num1 = 10 // 지역변수
val num2 = 3 // 지역변수
val result = noPureFunction( num1, num2)
println(result)
}
fun noPureFunction(a : Int, b : Int) : Int {
return a + b + global // 입력값과 무관하게 외부의 변수 사용
}
순수 함수를 왜?
입력과 내용을 분리하고 모듈화 하므로 재사용성이 높아진다.
- 여러가지 함수들과 조합해도 부작용이 없다.
특정 상태에 영향을 주지 않으므로 병행 작업 시 안전하다.
함수의 값을 추적하고 예측 할 수 있기때문에 테스트, 디버깅 등이 유리하다.
함수형 프로그래밍에 적용
함수를 매개변수, 인자에 혹은 반환값에 적용 ( 고차함수 )
함수를 변수나 데이터 구조에 저장
유연성 증가
람다식이란?
익명 함수의 하나의 형태로 이름 없이 사용 및 실행이 가능
람다 대수로 부터 유래
{ x, y -> x + y } // 람다식의 예 (이름이 없는 함수 형태)
람다식의 이용
람다식은 고차 함수에서 인자로 넘기거나 결과값으로 반환 등을 할 수 있다.
일급 객체
일급 객체는 함수의 인자로 전달할 수 있다.
일급 객체는 함수의 반환값에 사용할 수 있다.
일급 객체는 변수에 담을 수 있다.
코틀린에서 함수는 1급 객체로 다룸 - 1급 함수라고도 한다.
고차함수
fun main () {
println(highFunc( { x, y -> x + y }, 10, 20) ) // 람다식 함수를 인자로 넘김
}
fun highFunc (sum : (Int , Int) -> Int, a : Int, b : Int) : Int = sum(a, b) {
return sum (a, b)
}
// 고차 함수 highFunc에 3개의 매개변수가 있고 첫번째 매개변수는 람다식으로 선언되었음. 두번째 세번재 매개변수들을 1번째 람다식에 대입하여 값을 반환하는 형태
함수형 프로그래밍 왜?
프로그램을 모듈화 해 디버깅하거나 테스트가 쉬움
간략한 표현식을 사용해 생산성이 높음
람다식과 고차함수를 사용하면서 다양한 함수 조합을 사용할 수 있음
정리
함수형 프로그래밍은 순수 함수를 조합해 상태 데이터 변경이나 부작용이 없는 루틴을 만들어 내며 이름 없는 함수 형태의 하나인 람다식을 이용해 함수를 변수처럼 매개변수, 인자, 반환값 등에 활용하는 고차 함수를 구성해 생산성을 높인 프로그래밍 방법
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] 다른 함수의 참조에 의한 호출 (0) | 2019.07.04 |
---|---|
[Kotlin] 고차 함수와 람다식 (0) | 2019.07.04 |
[Kotlin] 함수 선언하고 호출하기 (0) | 2019.07.03 |
[Kotlin] 자료형 변환 (0) | 2019.07.03 |
[Kotlin] 변수의 null (0) | 2019.07.03 |