함수형 프로그래밍을 지원하는 코틀린

TRASALBY·2023년 5월 11일
0

Kotlin

목록 보기
2/2

코틀린은 함수형 프로그래밍을 지원한다.

이전에도 다른 학습을 통해 코틀린은 함수형 프로그래밍을 지원한다는 것은 알고 있다. 그러나 여전히 함수형프로그래밍에 대한 질문을 받으면 제대로 대답하기 어려운 것 같다. 이번 기회에 확실하게 정리하고 가자

함수형 프로그래밍

자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임

함수형 프로그래밍에 대한 설명은 위와 같다. 그러나 솔직히 무슨말인지 이해하기가 쉽지 않다.
간단히 말하자면 수학적인 함수에서 f(x) = y 라는 함수가 있다면 x라는 값을 넣었을 때에는 항상 y라는 결과가 나타난다. 이러한 수학적 함수 방식을 가진 프로그래밍이라고 볼 수 있다.

함수형 프로그래밍의 핵심 개념은 3가지가 있다

  • 일급 객체인 시민
    함수를 일반 값들 처럼 다룰 수 있다. 함수를 변수에 저장 하거나 A함수의 인자로 B함수를 전달할 수도 있다.
  • 불변성
    한번 만들어지고 나면 내부가 바뀌지 않는 불변 객체를 사용한다.
  • 부수효과 없음
    입력이 같으면 항상 같은 출력을 나타내어 부수효과가 없다. 다른 객체의 상태를 변경시기키 않고 다른 외부환경과 상호작용 하지않는 순수함수를 사용한다.

그래서 함수형 프로그래밍이 가지는 이점은?

그렇다면 코틀린에서 함수형 프로그래밍을 사용하는 것으로 어떤 이점이 있는 것일까.

간결하다

첫번째로 간결성을 말할 수 있다. 순수함수를 값처럼 활용하여 강력한 추상화를 할 수 있고 코드의 중복을 막을 수 있다.
만약 비슷한 작업을 하는 두개의 코드가 있다고 가정하고 이 두개의 코드는 유사하지만 일부분이 다르다고 가정해보자. 이 때 두 록직의 공통부분을 따로 함수로 뽑아내고 다른 세부사항을 인자로 전달하여 간결하게 표현할 수 있다.

예를 들어 Alice라는 사람을 찾는 작업과 Bob이라는 사람을 찾는 작업으로 구분하도록 하겠다.


fun findPerson(personList: List<Person>, condition: (Person) -> Boolean): List<Person> {
    return personList.filter{it.age > 20 && condition(it)}
}

fun findAlice(personList: List<Person>) = findPerson(personList) { it.name == "Alice" }
fun findBob(personList: List<Person>) = findPerson(personList) { it.name == "Bob" }

기본적으로 사람을 찾는 findPerson함수는 20살 이상의 사람을 찾는 함수로 구현하였고 추가적으로 조건을 함수로 받아 사용할 수 있도록 구현하였다.

findAlice함수로 확인해 보면 기본적인 findPerson함수에 condition의 값으로 {it.name == "Alice"}를 전달하고 있다. 이때 람다식이라 불리는 무명함수를 사용해 좀더 간단히 표현할 수 있다.

다중 스레드에서 안전하다.

다중 스레드 환경에서 적절한 동기화 과정 없이 같은 데이터를 여러 스레드에서 접근할 수 있는 경우 여러 문제가 발생한다. 함수형 프로그래밍에서는 불변객체를 사용하고 순수함수를 사용하여 부수효과가 발생하지 않으므로 같은 데이터가 여러 스레드에서 변경 되는 것을 막을 수 있어 추가적인 동기화 작업을 적용하지 않아도 된다.

테스트 하기 쉽다.

부수효과가 있는 함수의 경우는 그 함수를 테스트하기 위한 환경을 구성하는 준비코드가 필요하게 된다. 하지만 순수함수는 그 자체를 독립적으로 테스트 할 수 있다.

0개의 댓글