본문 바로가기

프로그래밍/코틀린

[코틀린] 함수형 프로그래밍이란?

현대의 프로그래밍 언어에서 함수형 프로그래밍은 중요한 이슈 중 하나이다.

코틀린도 마찬가지로 함수형 프로그래밍(Functional Programming, 약어로 FP)을 위한 많은 기법을 제공한다.

 

일단, 함수형 프로그래밍이란 일종의 프로그래밍 패러다임이다.

소프트웨어 개발 패러다임의 역사가 절차지향에서 객체지향으로 변화했듯이

요즘에는 함수형 프로그래밍이 떠오르고 있다.

 

각 프로그래밍 패러다임을 아래와 같이 정리할 수 있다.

 

* 절차지향 프로그래밍

- 알고리즘과 로직 중심으로 문제 해결이 주목적 (ex c, pascal)

 

* 객체지향 프로그래밍

- 클래스 선언이 최우선, 데이터와 데이터를 처리할 메서드를 하나로 묶어 객체로 만들고

객체를 조합해서 프로그래밍을 작성

객체를 만들기 위한 추상화, 캡슐화, 상속, 다형성 등의 개념 제공 (ex 자바, c++)

 

*함수형 프로그래밍

- 함수 선언이 최우선, 

데이터 흐름이 아니라 함수의 선언과 선언된 함수의 유기적인 흐름이 주목적 (ex 코틀린 스칼라, 스위프트 등)

 

함수형 프로그래밍의 핵심

데이터 흐름과 값의 변경에 따라 프로그래밍하지 말고

필요한 로직을 함수로 만들어서 함수들의 흐름에 따라 프로그래밍하자는 개념이다.

 

함수형 프로그래밍에는 여러가지 원칙이 있다.

하지만 가장 큰 핵심은 크게 두가지이다.

 

1. 일급 객체(First Class Citizen)로서의 함수

- 함수가 프로그램의 최상위 구성요소라는 의미이다.

객체 지향에서는 클래스가 일급 객체이다. 클래스가 최상위 단위이고 함수가 그안에 포함된다.

 

반면 함수형 프로그래밍은 일급 객체로서 함수를 정의할 수 있어야한다.

클래스를 선언하지 않고도 함수를 정의할 수 있어야하고,

함수 내에 다양한 구성요소(다른 함수, 클래스)를 포함할 수 있어야한다.

또, 함수를 변수처럼 사용할 수 있어야한다.

어떤 함수의 인수로 함수를 전달을 할 수 있어야하고, 반환할 수 있어야한다.

 

2. 순수 함수(Pure Function)로 정의되는 함수

- 부수효과(Side Effect)가 발생하지 않는 함수이다.

부수효과가 발생하지 않는 다는 것은 인수를 전달해서 함수를 호출하면 항상 같은 결과값을 반환한다는 의미이다.

이처럼 순수 함수가 되려면 함수 내에서 함수 밖의 데이터를 변경하는 작업이 발생하지 않아야하고,

별도의 입출력이 발생하지 않아야한다.

 

위의 두 원칙을 바탕으로한 함수형 프로그래밍에서의 데이터

변경되지 않고, 프로그램의 상태만 표현한다. (데이터 불변성)

함수에서 데이터는 변경하지 않고 새로운 데이터를 만들어 반환한다.

 

다시 말해서, 하나의 데이터가 변수에 저장되어 계속 변경되면서 데이터의 변경 흐름에 따라 프로그래밍하는 것이 아닌

변할 수 없는 상수 데이터만 이용하고 함수의 흐름에 따라 프로그래밍 하자는 개념이다.

 

그러면? 왜 굳이 함수형 프로그래밍을 해야하나?

 

코드가 간결하고 개발 생산성과 유지 보수성의 증대된다.

동시성 작업을 좀 더 쉽고 안전하게 구현할 수 있다.

 

데이터 흐름에 따라서 프로그래밍을 하게 되면, 알고리즘에 따라서 분석할 수 밖에 없다.

어떤 함수를 선언했다는 사실이 중요한 것이 아닌 함수 내에서 데이터를 어떻게 변경하고 이용하는지 초점을 맞추어 분석해야한다.

 

함수형 프로그래밍으로 작성하면 함수 내에서 데이터를 변경하지도 않으므로 부수효과가 발생하지 않는다.

그렇기에 전체 애플리케이션의 흐름을 알기 위해서 내부를 분석할 필요가 없다.

그냥 어떤 함수가 선언이 되었는지만 파악하면서 분석하고 개발할 수 있게 된다.

이렇기에 코드가 간결해지고, 개발 생산성과 유지 보수성이 증대된다.

 

시간이 흐르면 흐를 수록 데이터의 처리량이 방대해지다 보니 멀티코어 프로세싱이 기본이 된 상황이다.

함수형 프로그래밍은 순수 함수를 이용하고 부수효과가 발생하지 않으므로, 스레드 안전성을 확보할 수 있고 병렬 처리에 도움을 주게 된다.

 

코틀린에서 함수형 프로그래밍을 지원하면 객체 지향 프로그래밍은 불가능한가?

함수형 프로그래밍은 객체지향 프로그래밍과 대척점에 있는 패러다임이 아니다.

상호 배타적인 개념이 아니라 얼마든지 함께 이용할 수 있다.

 

자바는 함수형 프로그래밍을 지원하지 않는가?

자바에서는 람다 표현식을 제공한다.

비교적 최신 언어보다 함수형 프로그래밍의 지원이 미약하다는 정도로 얘기할 수 있다.

 

순수 함수? 부수효과가 발생하지 않는 함수? 이게 가능한가?

수학 공식을 그대로 전산화하는 프로그램에서는 가능하다.

하지만 비즈니스 로직을 전산화하는 프로그램에서는 사실상 불가능하다.

많은 데이터는 파일, 데이터베이스, 네트워크 등에 저장해야하고, 그 데이터를 읽어서 사용한다.

부수효과가 발생할 수 밖에 없다.

100%로 순수함수, 부수효과를 없애겠다는 것은 불가능하다.

결국, 이러한 부수효과가 발생하는 함수를 가지더라도

전체 프로그램에서 얼마나 많은 부분을 함수형 프로그래밍 패러다임에 맞게 작성하는지가 관건인거 같다.