자바 8의 함수형 프로그래밍과 람다 표현식 활용 예제

자바 8의 함수형 프로그래밍 개요

자바 8은 대규모 시스템 개발을 위한 기존 자바 버전과는 많은 부분이 달라졌다. 그 중에서도 가장 중요한 변화는 함수형 프로그래밍 패러다임의 도입이다. 이전 자바 버전에서는 객체 지향 프로그래밍 패러다임에만 의존하였으나, 자바 8에서는 함수형 프로그래밍 패러다임과 객체 지향 프로그래밍 패러다임이 동시에 지원된다.

함수형 프로그래밍은 입력과 출력만을 다루는 함수로 프로그램을 구성하는 프로그래밍 패러다임이다. 이 패러다임은 부작용을 줄이고, 코드의 재사용성을 높이며, 병렬 프로그래밍을 쉽게 구현할 수 있다는 장점이 있다. 자바 8에서는 이러한 장점을 활용하기 위해 람다 표현식과 스트림 API를 제공하고 있다.

람다 표현식 활용 방법과 장점

람다 표현식은 간단하게 말해 함수를 만드는 것이다. 이전 자바 버전에서는 함수를 만들기 위해서는 인터페이스를 구현하고, 그 인터페이스를 구현하는 클래스를 만들어야 했다. 이는 매우 번거로운 작업이었다. 하지만 자바 8에서는 람다 표현식을 사용하여 인터페이스 구현을 간단하게 만들 수 있다.

람다 표현식은 다음과 같은 형태를 가진다.

(parameter1, parameter2, ..., parameterN) -> expression

람다 표현식은 다음과 같은 장점을 가진다.

  1. 코드의 간결성: 람다 표현식을 사용하면 코드를 간결하게 만들 수 있다. 불필요한 코드를 제거하고, 코드의 가독성을 높일 수 있다.

  2. 병렬 프로그래밍: 람다 표현식은 병렬 프로그래밍을 쉽게 구현할 수 있도록 한다. 람다 표현식은 함수를 객체로 감싸지 않기 때문에, 함수 호출이 빠르다. 이는 병렬 프로그래밍에서 성능을 향상시키는데 도움을 준다.

  3. 함수형 프로그래밍: 람다 표현식은 함수형 프로그래밍 패러다임을 지원하기 때문에, 부작용을 줄이고, 코드의 재사용성을 높일 수 있다.

예제: 람다 표현식을 이용한 함수형 인터페이스 구현

람다 표현식을 사용하여 함수형 인터페이스를 구현하는 방법을 살펴보자. 먼저 다음과 같은 함수형 인터페이스를 정의한다.

@FunctionalInterface
interface MyFunction {
    int apply(int a, int b);
}

이 함수형 인터페이스는 두 개의 int 값을 입력으로 받아서, int 값을 반환하는 함수를 표현한다. 이제 이 함수형 인터페이스를 구현하기 위해 람다 표현식을 사용해보자.

MyFunction add = (a, b) -> a + b;
MyFunction subtract = (a, b) -> a - b;
MyFunction multiply = (a, b) -> a * b;

위 코드에서는 add, subtract, multiply 세 개의 MyFunction 객체를 생성하고 있다. 각 객체는 람다 표현식으로 생성되며, 각각 덧셈, 뺄셈, 곱셈을 수행하는 함수를 표현한다.

이제 이 함수를 사용해보자. 다음과 같이 코드를 작성하면 된다.

int result = add.apply(1, 2); // 3
result = subtract.apply(3, 2); // 1
result = multiply.apply(2, 3); // 6

위 코드에서는 각각의 MyFunction 객체를 사용하여 함수를 호출하고 있다. 이를 통해 람다 표현식을 사용하여 함수를 구현하는 방법을 살펴보았다.

예제: Stream API를 활용한 함수형 프로그래밍 실습

이번에는 Stream API를 사용하여 함수형 프로그래밍을 구현하는 방법을 살펴보자. Stream API는 자바 8에서 새로 추가된 API로, 컬렉션을 다루는 데 매우 유용하다.

먼저 다음과 같은 문자열 리스트를 생성한다.

List words = Arrays.asList("apple", "banana", "cherry", "date", "elderberry", "fig", "grape");

이 리스트에서 길이가 5 이상인 단어만 출력하는 코드를 작성해보자.

words.stream()
    .filter(word -> word.length() >= 5)
    .forEach(System.out::println);

위 코드에서는 Stream API의 filter() 메서드를 사용하여 길이가 5 이상인 단어만 추출하고, forEach() 메서드를 사용하여 각 단어를 출력하고 있다. 이를 실행하면 다음과 같은 결과가 출력된다.

banana
cherry
elderberry

이번에는 문자열 리스트를 정렬하는 코드를 작성해보자.

words.stream()
    .sorted()
    .forEach(System.out::println);

위 코드에서는 Stream API의 sorted() 메서드를 사용하여 문자열 리스트를 정렬하고, forEach() 메서드를 사용하여 각 단어를 출력하고 있다. 이를 실행하면 다음과 같은 결과가 출력된다.

apple
banana
cherry
date
elderberry
fig
grape

이번에는 문자열 리스트에서 중복을 제거하는 코드를 작성해보자.

words.stream()
    .distinct()
    .forEach(System.out::println);

위 코드에서는 Stream API의 distinct() 메서드를 사용하여 중복을 제거하고, forEach() 메서드를 사용하여 각 단어를 출력하고 있다. 이를 실행하면 다음과 같은 결과가 출력된다.

apple
banana
cherry
date
elderberry
fig
grape

위 예제에서는 Stream API를 사용하여 함수형 프로그래밍을 구현하는 방법을 살펴보았다. Stream API는 매우 강력한 기능을 가지고 있으며, 컬렉션을 다루는 데 매우 유용하다. 이를 적극적으로 활용하면 복잡한 로직을 간단하게 구현할 수 있다.

결론

자바 8에서는 함수형 프로그래밍 패러다임이 도입되었다. 이를 활용하기 위해 람다 표현식과 스트림 API를 제공하고 있다. 람다 표현식은 함수를 만드는 데 매우 유용하며, 스트림 API는 컬렉션을 다루는 데 매우 유용하다. 이를 적극적으로 활용하면 코드의 간결성과 가독성을 높일 수 있으며, 병렬 프로그래밍과 함수형 프로그래밍을 쉽게 구현할 수 있다. 따라서 자바 개발자라면 자바 8에서 제공하는 함수형 프로그래밍 패러다임을 적극적으로 활용해보는 것이 좋다.

Functional Programming