IMCAT.DEV
로그인 가입
Java 중급 문법

Java Java 8의 주요 기능

Java Java 8의 주요 기능 — 중급

Java 8의 주요 기능

1. 도입 (왜 배워야 하는가)

Java 8은 자바 프로그래밍 언어의 중요한 전환점으로, 이 버전에서 도입된 기능들은 프로그래머들이 더 나은 코드 품질을 유지하고, 효율적으로 작업할 수 있도록 돕습니다. 실무에서는 개발의 생산성을 높이고, 코드의 가독성을 향상시켜 유지보수 비용을 줄이는 것이 매우 중요합니다.

Java 8의 기능을 이해하지 못하면, 복잡한 문제를 해결하기 위해 불필요하게 많은 코드와 시간을 소비하게 될 수 있습니다. 특히, 함수형 프로그래밍의 개념을 잘 모른다면, 코드의 재사용성과 조합성을 활용하지 못해 비효율적인 코드가 만들어질 위험이 있습니다.

2. 핵심 개념 설명

Java 8의 주요 기능은 다음과 같습니다:

기능설명
람다 표현식익명 함수로, 코드를 간결하게 작성할 수 있도록 도와줍니다.
스트림 API컬렉션을 쉽게 처리하고, 병렬 처리할 수 있는 기능을 제공합니다.
Optional 클래스NullPointerException을 방지하는 안전한 객체 처리 방법입니다.

비유

  • 람다 표현식은 요리사가 요리법을 정리해 놓은 것과 비슷합니다. 요리사가 매번 요리법을 설명하지 않고, 필요한 재료와 요리법을 간단하게 적어 놓으면 훨씬 빠르고 효율적으로 요리를 할 수 있습니다.
  • 스트림 API는 강에서 물이 흐르는 것과 같습니다. 물이 흐르듯이 데이터가 자연스럽게 흐르고, 필터링, 매핑, 집계 등의 작업을 쉽게 수행할 수 있습니다.
  • Optional 클래스는 안전장치가 있는 자동차와 같아서, 사고를 방지하도록 설계되었습니다. NullPointerException을 피할 수 있는 안전한 방법을 제공합니다.
  • 3. 기본 코드 예제

    람다 표현식 예제

    import java.util.Arrays;
    import java.util.List;
    
    public class LambdaExample {
        public static void main(String[] args) {
            List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
            
            // 람다 표현식을 사용하여 이름 출력
            names.forEach(name -> System.out.println(name));
        }
    }

    실행 결과

    Alice
    Bob
    Charlie
  • Arrays.asList("Alice", "Bob", "Charlie"): 문자열 리스트를 생성합니다.
  • names.forEach(name -> System.out.println(name)): 리스트의 각 요소를 순회하며 출력하는 람다 표현식입니다.
  • 스트림 API 예제

    import java.util.Arrays;
    import java.util.List;
    
    public class StreamExample {
        public static void main(String[] args) {
            List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
            
            // 스트림을 사용하여 짝수만 필터링하고 제곱을 출력
            numbers.stream()
                   .filter(n -> n % 2 == 0)
                   .map(n -> n * n)
                   .forEach(System.out::println);
        }
    }

    실행 결과

    4
    16
  • numbers.stream(): 리스트를 스트림으로 변환합니다.
  • filter(n -> n % 2 == 0): 짝수만 필터링합니다.
  • map(n -> n * n): 필터링된 숫자를 제곱합니다.
  • forEach(System.out::println): 최종 결과를 출력합니다.
  • 4. 실전 활용 예제

  • 쇼핑몰에서 장바구니를 구현할 때:
  •   import java.util.Arrays;
      import java.util.List;
    
      public class ShoppingCart {
          public static void main(String[] args) {
              List<Double> prices = Arrays.asList(100.0, 200.0, 300.0);
              double total = prices.stream()
                                   .mapToDouble(Double::doubleValue)
                                   .sum();
              System.out.println("총 가격: " + total);
          }
      }

    실행 결과

      총 가격: 600.0
  • 사용자 리스트에서 특정 조건의 사용자 추출:
  •   import java.util.Arrays;
      import java.util.List;
    
      public class UserFilter {
          public static void main(String[] args) {
              List<String> users = Arrays.asList("Alice", "Bob", "Charlie", "David");
    
              // 'A'로 시작하는 사용자 필터링
              users.stream()
                   .filter(user -> user.startsWith("A"))
                   .forEach(System.out::println);
          }
      }

    실행 결과

      Alice

    5. 흔한 실수와 주의사항

  • 람다 표현식에서의 주의사항:
  • - 잘못된 코드:

        names.forEach((name) -> System.out.println(name)); // 괄호를 잘못 사용

    - 올바른 코드:

        names.forEach(name -> System.out.println(name)); // 괄호 없이 사용
  • 스트림의 중간 연산과 최종 연산:
  • - 잘못된 코드:

        long count = numbers.stream().filter(n -> n % 2 == 0); // 최종 연산이 없음

    - 올바른 코드:

        long count = numbers.stream().filter(n -> n % 2 == 0).count(); // 최종 연산 추가

    6. 정리

  • Java 8의 람다 표현식은 코드의 간결성을 증가시킵니다.
  • 스트림 API를 사용하면 컬렉션의 데이터를 더 쉽고 효율적으로 처리할 수 있습니다.
  • Optional 클래스를 활용하여 NullPointerException을 예방할 수 있습니다.

다음에 학습하면 좋은 주제는 Java 8의 병렬 처리와 CompletableFuture입니다. 이 두 가지는 멀티스레딩 환경에서의 효율성을 극대화할 수 있는 중요한 개념입니다.