학습
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의 병렬 처리와 CompletableFuture입니다. 이 두 가지는 멀티스레딩 환경에서의 효율성을 극대화할 수 있는 중요한 개념입니다.