Kotlin

[Kotlin] 코틀린과 함수형 프로그래밍

카미유 2021. 12. 27. 10:36

함수형 프로그래밍의 핵심 개념

1. 일급 시민(first-class) 함수

함수(프로그램의 행동을 나타내는 코드 조각)을 일반 값처럼 다룰 수 있다. 함수를 변수에 저장할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어서 반환할 수 있다. (일급 시민에 대한 설명은 여기에서 확인)

2. 불변성(immutability)

함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다.

3. 부수 효과(side effect) 없음

함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수(pure function)를 사용한다.

함수형 프로그래밍의 장점

1. 간결성

함수형 코드는 그에 상응하는 명령형(imperative) 코드에 비해 더 간결하며 우아하다. (순수) 함수를 값처럼 활용할 수 있으면 더 강력한 추상화를 할 수 있고 강력한 추상화를 사용해 코드 중복을 막을 수 잇다.

2. 스레드 안정성

함수형 프로그래밍은 멀티 스레드를 사용해도 안전하다. 멀티 스레드 프로그램에서는 적절한 동기화 없이 같은 데이터를 여러 스레드가 변경하는 경우 가장 많은 문제가 생긴다. 불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경할 수 없다. 따라서 복잡한 동기화를 적용하지 않아도 된다.

3. 테스트 용이성

부수 효과가 있는 함수는 그 함수를 실행할 때 필요한 전체 환경을 구성하는 준비 코드(setup code)가 따로 필요하지만, 순수 함수는 그런 준비 코드 없이 독립적으로 테스트할 수 있다.

코틀린과 함수형 프로그래밍

자바 8 이전의 자바에서는 함수형 프로그래밍을 지원할 수 있는 기능이 거의 없었지만 코틀린은 처음부터 함수형 프로그래밍을 풍부하게 지원해 왔다. 그런 지원은 다음과 같다.

  • 함수 타입을 지원하여 어떤 함수가 다른 함수를 인자로 받거나 함수가 새로운 함수를 반환할 수 있다.
  • 람다식을 지원하여 번거로운 준비 코드를 작성하지 않아도 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있다.
  • 데이터 클래스는 불변적인 값 객체(value object)를 간편하게 만들 수 있는 구문을 제공한다.
  • 코틀린 표준 라이브러리는 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다.

코틀린은 함수형 스타일로 프로그래밍이 가능하지만 이것을 강제하지는 않는다. 명령형 방식이 더 적합한 경우라면 함수형 프로그래밍으로 번거롭게 코드를 작성할 필요 없이 직접 변경 가능한 데이터와 부수 효과를 활용하는 함수를 사용해도 된다. 당연히 인터페이스와 클래스 계층 구조를 바탕으로 하는 프레임워크도 자바를 사용할 때와 마찬가지로 쉽게 쓸 수 있다. 코틀린으로 코드를 작성할 때는 객체지향과 함수형 접근 방법을 함께 조합해서 문제에 가장 적합한 도구를 사용하면 된다.