시작
함수형 프로그래밍은 프로그래밍 패러다임 중 하나로 함수를 값처럼 다루는 프로그래밍 방식입니다. 함수형 프로그래밍은 다음과 같은 특징을 가진다. 요즘은 함수형 프로그래밍이 대세가 되어가고 있기에 꼭 알아두어야 할 필요가 있습니다.
본문
순수 함수
순수 함수란 함수의 결과가 오직 인자에만 의존하는 함수를 말합니다. 즉, 함수가 외부의 상태에 의존하지 않는 함수를 말합니다.
Java에서 순수 함수를 구현하는 방법은 다음과 같습니다.
int add(int a, int b) {
return a + b; // 외부 상태에 의존하지 않음
}
Kotlin에서 순수 함수를 구현하는 방법은 다음과 같습니다.
fun add(a: Int, b: Int): Int {
return a + b // 외부 상태에 의존하지 않음
}
불변성
불변성이란 데이터가 변경되지 않는 것을 말합니다.
Java에서 불변성을 구현하는 방법은 다음과 같습니다. Java 14부터 record
가 추가되어 불변성을 구현할 수 있습니다.
record Person(String name, int age) {
}
Kotlin에서 불변성을 구현하는 방법은 다음과 같습니다. Kotlin에서 data class
를 사용하여 불변성을 구현할 수 있습니다.
data class Person(val name: String, val age: Int)
고차 함수
고차 함수란 함수를 인자로 받거나 함수를 반환하는 함수를 말합니다.
Java에서 고차 함수를 구현하는 방법은 다음과 같습니다.
@FunctionalInterface
int calculate(int a, int b, Function function) {
return function.apply(a, b); // 함수 호출
}
Kotlin에서 고차 함수를 구현하는 방법은 다음과 같습니다.
fun calculate(a: Int, b: Int, function: (Int, Int) -> Int): Int {
return function(a, b) // 함수 호출
}
재귀 함수
재귀 함수란 함수가 자기 자신을 호출하는 함수를 말합니다.
Java에서 재귀 함수를 구현하는 방법은 다음과 같습니다.
int factorial(int n) {
if (n == 0) {
return 1;
}
return n * factorial(n - 1); // 재귀 호출
}
Kotlin에서 재귀 함수를 구현하는 방법은 다음과 같습니다.
fun factorial(n: Int): Int {
if (n == 0) {
return 1
}
return n * factorial(n - 1) // 재귀 호출
}
클로저(Closure)
클로저란 함수가 자유 변수를 포함하는 함수를 말합니다. 즉 캡처
된 변수를 사용하는 함수를 말합니다.
Java에서 클로저를 구현하는 방법은 다음과 같습니다.
int a = 10; // 캡처된 변수
Function function = (b) -> a + b; // 클로저
Kotlin에서 클로저를 구현하는 방법은 다음과 같습니다.
val a = 10 // 캡처된 변수
val function = { b: Int -> a + b } // 클로저
지연 평가 (Lazy Evaluation)
지연 평가란 필요할 때만 계산을 하는 방식을 말합니다. 즉, 계산 결과를 캐싱하지 않고 필요할 때마다 계산을 하는 방식을 말합니다.
Java에서 지연 평가를 구현하는 방법은 다음과 같습니다. Java에서 컬렉션 Stream API를 사용하여 지연 평가를 구현할 수 있습니다.
Supplier<Integer> supplier = () -> {
System.out.println("계산 중");
return 1;
};
List<Integer> list = List.of(1, 2, 3, 4, 5);
list.stream()
.map(supplier) // 지연 평가
.filter(i -> i > 2) // 지연 평가
.collect(Collectors.toList()); // 즉시 평가 (Eager Evaluation)
Kotlin에서 지연 평가를 구현하는 방법은 다음과 같습니다.
val supplier = {
println("계산 중")
1
}
커링 (Currying)
커링이란 여러 개의 인자를 받는 함수를 하나의 인자를 받는 함수로 변환하는 방식을 말합니다.
Java에서 커링을 구현하는 방법은 다음과 같습니다.
Function<Integer, Function<Integer, Integer>> currying =
a -> b -> a + b;
Kotlin에서 커링을 구현하는 방법은 다음과 같습니다.
val currying = { a: Int -> { b: Int -> a + b } }
마무리
함수형 프로그래밍에 대해 간단히 알아보았습니다. 함수형 프로그래밍은 프로그래밍 패러다임 중 하나로 함수를 값처럼 다루는 프로그래밍 방식입니다. 함수형 프로그래밍은 순수 함수, 불변성, 고차 함수, 재귀 함수,
클로저, 지연 평가, 커링 등의 특징을 가지고 있습니다.
댓글