IT 공부 독서 정리/Java의 정석

람다식 설명 - 정리

방탄승 2024. 12. 1. 19:52

람다식 코드의 사용이 가능해졌다.

람다식이란 객체지향인 java언어에 함수형 프로그래밍을 지원하기 위해 추가된 개념이다.

 

아래는 기존 자바 코드와 람다식 코드를 비교해 본 결과이다.

정렬을 위해 Comparator 인터페이스를 사용한 코드

import java.util.Arrays;
import java.util.Comparator;

public class LambdaExample {
    public static void main(String[] args) {
        // 문자열 배열 생성
        String[] names = {"A", "B", "C", "D"};

        // Arrays.sort를 사용하여 문자열 배열을 길이로 정렬
        Arrays.sort(names, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return Integer.compare(s1.length(), s2.length());
            }
        });

        // 정렬된 배열 출력
        for (String name : names) {
            System.out.println(name);
        }
    }
}

 

 

람다 표현식을 활용한 코드

import java.util.Arrays;

public class LambdaExample {
    public static void main(String[] args) {
        // 문자열 배열 생성
        String[] names = {"A", "B", "C", "D"};

        // 람다 표현식을 사용하여 문자열 배열을 길이로 정렬
        Arrays.sort(names, (s1, s2) -> Integer.compare(s1.length(), s2.length()));

        // 정렬된 배열 출력
        for (String name : names) {
            System.out.println(name);
        }
    }
}

 

람다식의 이해

 

  • 장점:
    • 코드 간결성 및 가독성 향상: 소스 코드를 매우 간결하게 작성할 수 있어 전체적인 가독성이 높아집니다.
    • 작성 시간 단축: 코드가 간결하므로 개발 시간이 단축됩니다.
    • 유지보수 용이성: 간결한 코드는 유지보수 측면에서도 유리합니다.
  • 단점:
    • 복잡한 코드의 가독성 저하: 간결함 때문에 복잡한 로직을 람다식으로 작성할 경우 오히려 가독성이 떨어질 수 있습니다.

결론

  • 가독성 향상을 위한 선택지 추가: 람다식은 소스코드의 가독성을 높일 수 있는 새로운 방법론을 제공합니다.
  • 개발자의 적절한 활용 중요: 개발자는 람다식과 기존 방식을 적절히 조합하여 가독성이 뛰어난 코드를 개발할 수 있습니다.

 

2. 스트림 API의 사용이 가능해졌다.

스트림 API란 컬렉션(Collection) 또는 배열과 같은 데이터를 효율적으로 처리할 수 있도록 도와주는 데이터 처리 파이프라인이다. 

 

스트림 API의 특징은 아래와 같다.

 

  • 데이터 흐름 중심:
    • 데이터 소스(컬렉션, 배열 등)에서 한 방향으로 데이터를 처리하는 연속적인 작업 흐름을 제공
  • 함수형 프로그래밍 스타일:
    • 람다 표현식과 함께 사용하여 코드를 간결하게 작성할 수 있다.
    • 불변성을 유지하며, 데이터를 변경하지 않고 새로운 데이터 흐름을 생성한다.
  • 중간 연산과 최종 연산:
    • 중간 연산(Intermediate Operation): 데이터를 변환하거나 필터링 
    • 최종 연산(Terminal Operation): 데이터를 집계하거나 출력 
  • 지연 연산(Lazy Evaluation):
    • 중간 연산은 결과를 즉시 계산하지 않고, 최종 연산이 호출될 때 실행되어, 성능 최적화를 할 수 있다.
  • 병렬 처리 지원:
    • parallelStream()을 사용하면 데이터를 병렬로 처리하여 멀티코어 CPU의 성능을 극대화할 수 있다.

 

아래는 스트림 API를 사용하지 않은 코드이다. 

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class WithoutStream {
    public static void main(String[] args) {
        List<String> names = List.of("Alice", "Bob", "Charlie", "Anna", "Amanda");

        // 필터링 결과를 저장할 리스트 생성
        List<String> filteredNames = new ArrayList<>();
        for (String name : names) {
            if (name.startsWith("A")) {
                filteredNames.add(name.toUpperCase());
            }
        }

        // 정렬
        Collections.sort(filteredNames);

        // 출력
        for (String name : filteredNames) {
            System.out.println(name);
        }
    }
}

 

위 코드를 보면 명령형 프로그램이 스타일로 작성이 되어 있으며, 반복문과 조건문들이 명시적으로 작성되어 있어, 코드의 길이가 길고 가독성이 떨어진다는 단점이 있으며, 정렬된 결과를 저장하기 위한 List변수가 필요하다는 단점이 존재한다.

 

import java.util.List;

public class WithStream {
    public static void main(String[] args) {
        List<String> names = List.of("Alice", "Bob", "Charlie", "Anna", "Amanda");

        names.stream()
             .filter(name -> name.startsWith("A"))  // 조건 필터링
             .map(String::toUpperCase)              // 대문자로 변환
             .sorted()                              // 정렬
             .forEach(System.out::println);         // 출력
    }
}

 

하지만, 위와 같이 Stream API를 사용하여 작성을 하게 되면, 선언형 프로그래밍 작성이 가능해져서 코드가 매우 가독성이 좋아지며, 추가적으로 중간 결과를 저장하기 위한 변수 등 없이 작성이 가능하다는 장점이 있다. 또한 데이터를 처리하는 로직이 명확하게 구분된다는 장점이 있다.