함수형 프로그래밍


다중 패러다임언어 코틀린

코틀린은 함수형 프로그래밍객체지향 프로그래밍 패러다임을 모두 사용 가능한 다중 패러다임 언어이다.

이번 페이지에서는 가볍게 함수형 프로그래밍에 대한 개념과 코틀린에서 어떻게 사용하는지 간단하게 살펴본다.

함수형 프로그래밍이란

함수형 프로그래밍순수 함수를 작성하여 프로그램의 부작용을 줄이는 프로그래밍 기법을 말한다. 그리고 함수형 프로그래밍에서는 일급 객체로써의 함수람다식, 고차 함수를 활용한다.

순수 함수

함수형 프로그래밍은 순수 함수 사용을 지향한다고 이야기 하였다.

어떤 함수가 같은 인자에 대하여 항상 같은 결과를 반환한다면 부작용이 없는 함수라고 할 수 있다. 그리고 부작용이 없는 함수가 함수 외부의 어떤 상태도 변경하지 않는다면 이를 순수 함수라고 말할 수 있다.

순수 함수의 이런 특성은 다중 스레드에 사용해도 안전하고 코드를 테스트 하기도 쉽다는 장점이 있다.


  • 순수 함수의 조건
    • 같은 인자에 대하여 항상 같은 값을 반환
    • 함수 외부의 어떤 상태도 변경하지 않음

람다식

{x, y -> x + y}

람다식함수의 이름이 없고 ->가 사용된 단순화된 함수 표현식이다.

자바에서는 람다식함수형 인터페이스의 구현체인 반면 코틀린에서는 별도의 함수형 인터페이스를 두지 않고 람다식을 사용 가능하다.

일급 객체

함수형 프로그래밍에서는 함수를 일급 객체로 생각한다. 람다식 역시 일급 객체의 특징을 가지고 있다.

  • 일급 객체의 특징
    • 일급 객체는 **함수의 인자로 전달 가능**
    • 일급 객체는 **함수의 반환값에 사용 가능**
    • 일급 객체는 **변수에 할당 가능**

위와 같은 특징으로 람다식함수의 인자로 전달 가능하고 함수의 반환값으로 사용 가능하며 변수에 할당이 가능하다.

즉, 람다식은 일급 객체의 특성을 가진 이름이 없는 함수이다.

고차 함수

일급 함수**일반 객체처럼 사용 가능한 함수라면 **고차 함수는 일급 함수를 사용하는 함수라고 할 수 있다.


highFunc 함수와 같이 일급 함수를 매개변수로 사용하거나, 일급 함수를 반환값으로 사용하는 함수를 고차 함수라고 한다.


람다식은 인자가 없거나 반환값이 없을 수 있다.

이름이 없는 함수를 표현하기 위해 등장한 람다식은 함수형 프로그래밍에서 아주 중요한 개념이다.

람다식은 함수 자체를 인자나 변수로 사용할 수 있어 프로그램의 효율성도 높일 수 있다.

반면 람다식상당한 유연성을 제공(행동의 파라미터화 등)하지만 높은 러닝커브 때문에 약간을 어려워 보일 수 있다.

이제 람다식의 다양한 상황에서의 활용 방법을 살펴보자.

람다식과 고차 함수 호출

  • 여기서 잠깐
    • 기본형 변수(Primitive Data Type)Stack에 저장되고 함수의 인자로 전달될 때 값의 복사가 전달된다.
    • 참조형 변수(Reference Data Type)으로 할당된 객체는 Heap에 위치하고, StackHeap의 주소값이 저장되어 객체가 함수에 전달될 때는 Stack에 저장된 객체의 주소값이 복사되어 전달된다.
    • 이처럼 JVM에서 동작하는 코틀린/자바와 같은 언어는 Call By Value가 일반적이다. C/C++과 같이 포인터 주소 연산이 없기 때문에 Call By Reference는 사용되지 않는다.
    • 다시말해, 자바는 객체가 전달될 때 값의 복사가 전달되고, 이 값이 주소값 일 뿐이다.
    • 코틀린은 람다식을 사용하면 몇 가지 확장된 호출 방법을 사용할 수 있다.

값에 의한 호출로 람다식 사용

자바와 같이 함수의 인자로 함수 또는 함수를 호출하면 함수의 결과가 인자로 전달된다.


이름에 의한 람다식 호출

고차 함수의 매개변수를 람다식 타입으로 선언하면 람다식의 이름으로 인자를 전달할 수 있다.

이는 자바에서 매개변수를 함수형 인터페이스로 선언하고 람다식을 인자로 전달하는 것과 동일하다.


인자로 함수 참조 전달하기

람다식이 아닌 일반 함수를 함수의 인자로 전달하는 방법으로 함수 참조 전달이 있다.


이처럼 함수 참조를 전달함으로써 람다식을 좀 더 간소화 하여 인자로 전달할 수 있다.

또한 함수의 매개변수가 람다식 타입 한 개 일 경우에는 소괄호()를 생략할 수 있다.


매개변수가 하나인 람다식


함수의 인자로 매개변수가 한 개인 람다식을 전달할 때에는 매개변수를 명시하지 않고 it으로 대체할 수 있다. 코틀린 컴파일러가 타입을 추론할 수 있기 때문

매개변수가 두 개인 람다식

람다식의 매개변수가 두 개 이상인 경우 매개변수 생략이 불가능하다.


일반 매개변수와 람다식 타입 매개변수를 함께 사용

함수의 매개변수 중 마지막 매개변수가 람다식인 경우 가독성을 위해 소괄호 바깥으로 람다식 인자를 뺄 수 있다.


위 처럼 일반 인자는 소괄호() 내에 위치하고, 마지막 람다식 인자는 소괄호 바깥으로 뺄 수 있다.

일반 함수에 람다식 매개변수 2 개 이상 사용

소괄호()를 생략한 람다식 인자 전달은 함수에 람다식 타입 매개변수가 한 개 일때만 가능하다.

만일 람다식 매개변수가 2개 이상인 경우에는 소괄호 생략이 불가능하다.


고차 함수와 람다식의 사례 살펴보기

  • 공유 자원 보호


  • 네트워크 성공/실패 콜백
    • 자바


  • 코틀린