함수형 프로그래밍
다중 패러다임언어 코틀린
코틀린은 함수형 프로그래밍
과 객체지향 프로그래밍
패러다임을 모두 사용 가능한 다중 패러다임
언어이다.
이번 페이지에서는 가볍게 함수형 프로그래밍
에 대한 개념과 코틀린에서 어떻게 사용하는지 간단하게 살펴본다.
함수형 프로그래밍이란
함수형 프로그래밍
은 순수 함수
를 작성하여 프로그램의 부작용
을 줄이는 프로그래밍 기법을 말한다. 그리고 함수형 프로그래밍에서는 일급 객체로써의 함수
와 람다식
, 고차 함수
를 활용한다.
순수 함수
함수형 프로그래밍은 순수 함수
사용을 지향한다고 이야기 하였다.
어떤 함수가 같은 인자에 대하여 항상 같은 결과를 반환한다면 부작용이 없는 함수라고 할 수 있다. 그리고 부작용이 없는 함수가 함수 외부의 어떤 상태도 변경하지 않는다면 이를 순수 함수
라고 말할 수 있다.
순수 함수
의 이런 특성은 다중 스레드
에 사용해도 안전하고 코드를 테스트 하기도 쉽다는 장점이 있다.
- 순수 함수의 조건
- 같은 인자에 대하여 항상 같은 값을 반환
- 함수 외부의 어떤 상태도 변경하지 않음
람다식
{x, y -> x + y}
람다식
은 함수의 이름이 없고 ->
가 사용된 단순화된 함수 표현식
이다.
자바에서는 람다식
이 함수형 인터페이스의 구현체
인 반면 코틀린에서는 별도의 함수형 인터페이스
를 두지 않고 람다식
을 사용 가능하다.
일급 객체
함수형 프로그래밍에서는 함수를 일급 객체
로 생각한다. 람다식
역시 일급 객체
의 특징을 가지고 있다.
- 일급 객체의 특징
- 일급 객체는
**함수의 인자로 전달 가능**
- 일급 객체는
**함수의 반환값에 사용 가능**
- 일급 객체는
**변수에 할당 가능**
- 일급 객체는
위와 같은 특징으로 람다식
은 함수의 인자로 전달 가능
하고 함수의 반환값으로 사용 가능
하며 변수에 할당
이 가능하다.
즉, 람다식은 일급 객체의 특성을 가진 이름이 없는 함수이다.
고차 함수
일급 함수
가 **일반 객체
처럼 사용 가능한 함수
라면 **고차 함수는 일급 함수
를 사용하는 함수라고 할 수 있다.
위 highFunc
함수와 같이 일급 함수
를 매개변수로 사용하거나, 일급 함수
를 반환값으로 사용하는 함수를 고차 함수
라고 한다.
람다식은 인자
가 없거나 반환값
이 없을 수 있다.
이름이 없는 함수
를 표현하기 위해 등장한 람다식
은 함수형 프로그래밍에서 아주 중요한 개념이다.
람다식은 함수 자체를 인자나 변수로 사용할 수 있어 프로그램의 효율성도 높일 수 있다.
반면 람다식
은 상당한 유연성을 제공(행동의 파라미터화 등)하지만 높은 러닝커브
때문에 약간을 어려워 보일 수 있다.
이제 람다식
의 다양한 상황에서의 활용 방법을 살펴보자.
람다식과 고차 함수 호출
- 여기서 잠깐
기본형 변수(Primitive Data Type)
은Stack
에 저장되고 함수의 인자로 전달될 때값의 복사
가 전달된다.참조형 변수(Reference Data Type)
으로 할당된 객체는Heap
에 위치하고,Stack
에Heap
의 주소값이 저장되어 객체가 함수에 전달될 때는Stack에 저장된 객체의 주소값이 복사
되어 전달된다.- 이처럼
JVM
에서 동작하는 코틀린/자바와 같은 언어는Call By Value
가 일반적이다.C/C++
과 같이 포인터 주소 연산이 없기 때문에Call By Reference
는 사용되지 않는다. - 다시말해, 자바는 객체가 전달될 때
값의 복사
가 전달되고,이 값이 주소값 일 뿐
이다. - 코틀린은
람다식
을 사용하면 몇 가지확장된 호출 방법
을 사용할 수 있다.
값에 의한 호출로 람다식 사용
자바
와 같이 함수의 인자로 함수
또는 함수를 호출하면 함수의 결과가 인자로 전달
된다.
이름에 의한 람다식 호출
고차 함수의 매개변수를 람다식 타입
으로 선언하면 람다식의 이름으로 인자를 전달할 수 있다.
이는 자바
에서 매개변수를 함수형 인터페이스
로 선언하고 람다식
을 인자로 전달하는 것과 동일하다.
인자로 함수 참조 전달하기
람다식이 아닌 일반 함수를 함수의 인자로 전달하는 방법으로 함수 참조 전달
이 있다.
이처럼 함수 참조
를 전달함으로써 람다식
을 좀 더 간소화 하여 인자로 전달할 수 있다.
또한 함수의 매개변수가 람다식 타입 한 개
일 경우에는 소괄호()
를 생략할 수 있다.
매개변수가 하나인 람다식
함수의 인자로 매개변수가 한 개인 람다식
을 전달할 때에는 매개변수를 명시하지 않고 it
으로 대체할 수 있다. 코틀린 컴파일러가 타입을 추론할 수 있기 때문
매개변수가 두 개인 람다식
람다식의 매개변수가 두 개 이상인 경우 매개변수 생략이 불가능하다.
일반 매개변수와 람다식 타입 매개변수를 함께 사용
함수의 매개변수 중 마지막 매개변수가 람다식
인 경우 가독성을 위해 소괄호 바깥으로 람다식 인자를 뺄 수 있다.
위 처럼 일반 인자는 소괄호()
내에 위치하고, 마지막 람다식 인자는 소괄호 바깥으로 뺄 수 있다.
일반 함수에 람다식 매개변수 2 개 이상 사용
소괄호()
를 생략한 람다식 인자 전달은 함수에 람다식 타입 매개변수가 한 개 일때만 가능하다.
만일 람다식 매개변수가 2개 이상인 경우에는 소괄호 생략이 불가능하다.
고차 함수와 람다식의 사례 살펴보기
- 공유 자원 보호
- 네트워크 성공/실패 콜백
- 자바
- 코틀린