반응형
2024.09.21 - [개발/java] - [java8+] 함수형 프로그래밍 @FunctionalInterface
일급 객체 (First-Class Object)
- 변수에 할당할 수 있다: 함수를 변수에 할당할 수 있다.
- 인자로 전달할 수 있다: 함수를 다른 함수의 인자로 전달할 수 있다.
- 반환값으로 사용할 수 있다: 함수를 다른 함수의 반환값으로 사용할 수 있다.
import java.util.function.Function;
public class FirstClassObjectExample {
public static void main(String[] args) {
// 함수가 변수에 할당됨
Function<String, String> greet = name -> "Hello, " + name + "!";
// 함수가 매개변수로 전달됨
sayHello(greet, "Alice");
// 함수가 반환 값으로 사용됨
Function<String, String> greetFn = getGreetFunction();
System.out.println(greetFn.apply("Bob"));
}
public static void sayHello(Function<String, String> fn, String name) {
System.out.println(fn.apply(name));
}
public static Function<String, String> getGreetFunction() {
return name -> "Hi, " + name + "!";
}
}
고차 함수 (Higher-Order Function)
고차 함수는 다음 중 하나 이상의 조건을 만족하는 함수:
- 다른 함수를 인자로 받을 수 있다.
- 다른 함수를 반환할 수 있다.
Java 8의 Stream API는 함수형 프로그래밍의 개념을 적극 활용한다. 메서드 체이닝을 통해 고차 함수의 형태로 map, filter, reduce 등의 연산을 수행할 수 있다.
Java에서 콜백을 처리할 때 고차 함수가 자주 사용된다. 특정 작업이 완료되었을 때 실행할 동작을 함수로 전달할 수 있다.
import java.util.function.Consumer;
import java.util.function.Function;
public class HigherOrderFunctionExample {
public static void main(String[] args) {
// 함수를 매개변수로 받는 고차 함수
repeat(3, i -> System.out.println("Hello, " + i));
// 함수를 반환하는 고차 함수
Function<Integer, Integer> doubleFn = createMultiplier(2);
System.out.println(doubleFn.apply(5)); // 10
}
public static void repeat(int n, Consumer<Integer> action) {
for (int i = 0; i < n; i++) {
action.accept(i);
}
}
public static Function<Integer, Integer> createMultiplier(int multiplier) {
return value -> value * multiplier;
}
}
용어가 비슷해서 헷갈리지만 다른....(객체 지향 관련 개념)
일급 컬렉션 (First-class Collection)
일급 컬렉션은 컬렉션을 직접 사용하지 않고 컬렉션을 래핑하는 클래스를 만들어, 해당 클래스를 통해서만 컬렉션을 조작하도록 하는 디자인 패턴이다. 이를 통해 코드의 명확성과 유지 보수성을 높이고, 불변성을 보장할 수 있다.
- 불변성 보장: 일급 컬렉션 클래스는 컬렉션에 대한 직접적인 접근을 방지하고, 불변성을 유지하도록 도와준다.
- 비즈니스 로직 캡슐화: 컬렉션에 대한 비즈니스 로직을 일급 컬렉션 클래스 내부에 캡슐화하여 코드의 응집도를 높임.
- 컬렉션 관련 메서드 제공: 컬렉션을 조작하기 위한 메서드들을 일급 컬렉션 클래스에서 제공하여, 코드의 명확성을 높임.
- 특정 타입의 컬렉션 강제: 일급 컬렉션은 특정 타입의 컬렉션만을 다루도록 강제할 수 있다.
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
public class Products {
private final List<Product> products;
public Products(List<Product> products) {
this.products = new ArrayList<>(products);
}
// 불변성을 유지하기 위해 컬렉션 반환 시 복사본 제공
public List<Product> getProducts() {
return Collections.unmodifiableList(products);
}
// 전체 가격 계산 같은 비즈니스 로직 캡슐화
public double totalPrice() {
return products.stream()
.mapToDouble(Product::getPrice)
.sum();
}
// 제품 추가 메서드
public Products addProduct(Product product) {
List<Product> newProducts = new ArrayList<>(products);
newProducts.add(product);
return new Products(newProducts);
}
}
728x90
반응형
'개발 > java' 카테고리의 다른 글
[var] 타입 추론과 unchecked (1) | 2025.01.16 |
---|---|
[대규모, 비용 낮은] coroutine vs virtual thread (0) | 2024.12.24 |
[병렬처리] Folkjoinpool & executorService (0) | 2024.11.26 |
[동기화] 뮤텍스/세마포어 (0) | 2024.11.24 |
DB로 분산락 구현 (2) | 2024.11.21 |