25.02.17 TIL Java 8

신성훈·2025년 2월 17일

TIL

목록 보기
134/162

1. Java 8이란?

Java 8은 2014년 출시된 Java의 가장 큰 업데이트 중 하나로 함수형 프로그래밍을 지원하는 람다 표현식, 스트림 API, 인터페이스의 기본 메서드 등을 도입하여 개발자의 생산성을 크게 향상시켰습니다.

주요 특징

  • 함수형 프로그래밍 지원 (람다 표현식, 함수형 인터페이스)
  • 스트림 API (데이터 처리 간결화)
  • 인터페이스의 기본 메서드(Default Method)
  • 새로운 날짜 및 시간 API
  • Optional 클래스 (Null 방지)

2. 주요 기능 및 예제

1) 람다 표현식 (Lambda Expressions)

  • 익명 함수를 간결하게 표현
  • 불필요한 코드 제거로 가독성 증가
기존 방식 (익명 클래스)
// Runnable 인터페이스 사용
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, Java 7!");
    }
};
new Thread(runnable).start();
Java 8 람다 표현식
Runnable runnable = () -> System.out.println("Hello, Java 8!");
new Thread(runnable).start();

2) 함수형 인터페이스 (Functional Interface)

  • 단 하나의 추상 메서드만 가지는 인터페이스
  • @FunctionalInterface 어노테이션으로 명시 가능
  • Predicate, Function, Consumer, Supplier 등의 기본 제공 인터페이스 사용 가능
커스텀 함수형 인터페이스
@FunctionalInterface
interface MyFunction {
    int add(int a, int b);
}

public class LambdaExample {
    public static void main(String[] args) {
        MyFunction sum = (a, b) -> a + b;
        System.out.println(sum.add(10, 20)); // 30
    }
}

3) 스트림 API (Stream API)

  • 컬렉션(List, Set, Map 등)의 데이터를 함수형 스타일로 조작
  • 중간 연산(filter, map 등)과 최종 연산(forEach, collect 등)으로 구성
  • 원본 데이터를 변경하지 않고 처리 가능
기본 예제
import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Java", "Python", "Kotlin", "Go");
        
        names.stream()
             .filter(name -> name.length() > 4)
             .forEach(System.out::println);
    }
}
// 출력: Python, Kotlin

4) 인터페이스의 기본 메서드 (Default Method)

  • 기존 인터페이스를 변경하지 않고 새 기능 추가 가능
기본 메서드 예제
interface Vehicle {
    default void start() {
        System.out.println("Vehicle is starting...");
    }
}

class Car implements Vehicle {
    public void drive() {
        System.out.println("Car is driving...");
    }
}

public class DefaultMethodExample {
    public static void main(String[] args) {
        Car car = new Car();
        car.start(); // 인터페이스 기본 메서드 호출
        car.drive();
    }
}

5) 새로운 날짜 및 시간 API (java.time 패키지)

  • LocalDate, LocalTime, LocalDateTime, ZonedDateTime 등 제공
  • 기존 java.util.DateSimpleDateFormat의 단점을 해결
날짜 및 시간 처리
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("오늘 날짜: " + today);

        LocalDateTime now = LocalDateTime.now();
        System.out.println("현재 시간: " + now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    }
}

6) Optional 클래스 (NPE 방지)

  • null을 직접 다루지 않고 안전하게 값을 처리
  • orElse(), orElseGet(), ifPresent() 등의 메서드 제공
기본 예제
import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> optional = Optional.ofNullable(null);
        System.out.println(optional.orElse("기본값")); // 기본값
    }
}

3. Java 8의 장점과 단점

- 장점

  • 코드 간결화 (람다, 스트림 API 활용)
  • 병렬 처리 가능 (Stream의 parallel() 활용)
  • NullPointerException 방지 (Optional 활용)
  • 가독성 향상

- 단점

  • 기존 코드와의 호환성 문제 (특히 람다, 스트림 활용 시)
  • 성능 최적화 필요 (스트림 API 사용 시 과도한 연산 주의)

4. Java 8 이후 주요 버전 변화

버전주요 변경 사항
Java 9모듈 시스템 (Project Jigsaw), Stream.ofNullable()
Java 10var 키워드 도입 (지역 변수 타입 추론)
Java 11HttpClient 추가, String 관련 메서드 강화
Java 17패턴 매칭, sealed class 도입

5. 마무리

Java 8은 기존 Java보다 더 간결하고 함수형 스타일의 코딩이 가능하도록 개선되었습니다.
람다 표현식과 스트림 API 덕분에 코드 가독성이 높아졌고 Optional을 활용해 Null 처리를 더 안전하게 할 수 있었습니다.
실무에서도 Java 8 이상의 기능을 적극 활용하면 유지보수성과 성능을 모두 향상시킬 수 있다는 점이 인상적이었습니다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글