Java-8 (가장 큰 변혁)

발행: (2025년 12월 17일 오후 05:32 GMT+9)
3 min read
원문: Dev.to

Source: Dev.to

람다 표현식 (파트 1)

Java에서는 작은 로직 하나를 작성하더라도 매번 익명 클래스를 만들고 메서드를 오버라이드해야 했기 때문에 코드가 길어졌습니다. Java 8은 람다 표현식을 도입하여 짧고 깔끔하며 함수형 스타일로 코드를 작성할 수 있게 이 문제를 해결했습니다.

기본 문법

// 매개변수 없는 람다
() -> System.out.println("HI");

// 매개변수 하나인 람다
x -> x * x;

// 매개변수 두 개인 람다
(x, y) -> x * y;

// 블록 본문을 가진 람다
x -> {
    int y = x + 1;
    return y;
};

// 블록 본문을 가진 매개변수 없는 람다
() -> {
    System.out.println("HI");
}

Java 8 이전

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Running");
    }
}).start();

Java 8 이후

new Thread(() -> System.out.println("Running")).start();

변수 캡처

규칙: 캡처된 변수는 실질적으로 final 이어야 합니다.

int processedCount = 0;

orders.forEach(order -> {
    processedCount++;   // ❌ ERROR
});

Local variable processedCount defined in an enclosing scope must be final or effectively final.

해결 방법 1: AtomicInteger 사용

AtomicInteger processedCount = new AtomicInteger(0);

orders.forEach(order -> {
    processedCount.incrementAndGet();  // ✔ Works
});

System.out.println(processedCount.get());

AtomicInteger는 객체이며, 레퍼런스는 final이지만 내부 값은 변경될 수 있습니다.

해결 방법 2: 배열 래퍼 사용

int[] processedCount = {0};

orders.forEach(order -> {
    processedCount[0]++;   // ✔ Works
});

배열 레퍼런스는 final이지만, 배열 요소는 변형될 수 있습니다.

해결 방법 3: Stream count 사용

long processedCount = orders.stream().count();

Java 8을 이해하는 데 도움이 되었길 바랍니다. 다음 글에서는 Java 8의 컬렉션에 대해 다룰 예정이니 놓치지 마세요!

Back to Blog

관련 글

더 보기 »

Java 8 (Stream API)

Stream API의 특징 - Declarative – 함수형 스타일을 사용하여 간결하고 가독성 높은 코드를 작성한다. - Lazy Evaluation – 연산은 terminal 연산이 호출될 때만 실행된다.