자바 8 - 새로운 기능

안녕하세요, 미래의 자바 마법사 여러분! 저는 여러분과 함께 자바 8의 세상으로 흥미로운 여정을 시작하게 되어 설레습니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 수많은 학생들이 코딩 초보자에서 프로그래밍 천재로 변모하는 것을 목격해 왔습니다. 오늘, 우리는 자바 8이 제공하는 가장 쿨한 기능들 중 일부를 탐구해보겠습니다. 여러분의 좋아하는 음료를 준비하고, 편안하게 앉아 함께 들어보세요!

Java 8 - New Features

람다 표현식

상상해보세요, 파티에서 누군가가 당신에게 빠르게 자기소개를 하라고 요청합니다. 당신은 생애 이야기를 시작하지 않을 것입니다, 맞죠? 짧고, 달콤한 소개를 하잖아요. 그게 바로 자바에서 람다 표현식입니다 - 빠르고, 요점을 전달하는 함수 정의입니다!

간단한 예를 보겠습니다:

// 자바 8 이전
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello, old Java!");
}
};

// 자바 8 람다 표현식
Runnable runnableLambda = () -> System.out.println("Hello, Lambda!");

이 예제에서, 우리는 Runnable 객체를 생성하고 있습니다. 람다 표현식 () -> System.out.println("Hello, Lambda!");run() 메서드를 정의하는 간단한 방법입니다. "이를 실행할 때 'Hello, Lambda!'를 출력하라"고 말하는 것과 같습니다.

람다 표현식이 멋진 이유

  1. 코드를 더 읽기 쉽게 만듭니다.
  2. 기능을 메서드 인자로 처리할 수 있게 합니다.
  3. 더 간결한 코드를 작성할 수 있게 합니다.

메서드 참조

메서드 참조는 항상 가장 짧은 경로를 알고 있는 지혜로운 친구처럼입니다. 메서드나 생성자를 더 쉽게 참조할 수 있는 방법을 제공합니다.

다음은 맛있는 예제입니다:

List<String> fruits = Arrays.asList("apple", "banana", "cherry");

// 람다 사용
fruits.forEach(fruit -> System.out.println(fruit));

// 메서드 참조 사용
fruits.forEach(System.out::println);

이 상황에서 System.out::println은 메서드 참조입니다. "각 과일에 대해 System.out의 println 메서드를 사용하라"고 말하는 것입니다.

디폴트 메서드

디폴트 메서드는 항상 대체 계획을 가지고 있는 친구처럼입니다. 디폴트 메서드는 기존의 구현을 깨뜨리지 않고 인터페이스에 새로운 메서드를 추가할 수 있게 합니다.

public interface Vehicle {
default void startEngine() {
System.out.println("Vroom! Engine started.");
}
}

public class Car implements Vehicle {
// startEngine()을 구현할 필요 없음
}

Car myCar = new Car();
myCar.startEngine(); // 출력: Vroom! Engine started.

이 예제에서 startEngine()Vehicle 인터페이스의 디폴트 메서드입니다. Vehicle을 구현한 모든 클래스는 이 메서드를 무료로 사용할 수 있습니다!

Stream API

Stream API는 데이터를 처리하는 초고속 생산라인처럼입니다. 컬렉션의 객체를 선언적 방식으로 처리할 수 있게 합니다.

다음은 그것을 활용하는 예제입니다:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// 짝수의 합
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();

System.out.println("짝수의 합: " + sum);

이 코드는 "이 리스트의 숫자 중 짝수만 남기고, int로 변환한 후 합산하라"고 말하는 것과 같습니다. 이렇게 간단합니다!

Optional 클래스

Optional 클래스는 null 값을 위한 안전망입니다. 귀찮은 NullPointerException을 예방하는 데 도움이 됩니다.

다음은 예제입니다:

String name = null;
Optional<String> optionalName = Optional.ofNullable(name);

// 대신: if (name != null) { ... }
optionalName.ifPresent(n -> System.out.println("Hello, " + n));

// 또는 기본 값을 제공
String greeting = optionalName.orElse("stranger");
System.out.println("Hello, " + greeting);

Optional을 사용하면 값이 있든 없든 항상 준비되어 있습니다!

새로운 날짜 시간 API

자바 8은 더 직관적이고 사용하기 쉬운 새로운 날짜 시간 API를 도입했습니다.

LocalDate today = LocalDate.now();
System.out.println("오늘의 날짜: " + today);

LocalTime currentTime = LocalTime.now();
System.out.println("현재 시간: " + currentTime);

LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("현재 날짜와 시간: " + currentDateTime);

// 현재 날짜에 1주를 더해
LocalDate nextWeek = today.plusWeeks(1);
System.out.println("1주 후의 날짜: " + nextWeek);

이 새로운 API는 날짜와 시간을 다루는 것을 시계를 확인하는 것만큼 간편하게 만들어줍니다!

Nashorn 자바스크립트 엔진

마지막으로, 자바 8은 자바 애플리케이션 내에서 자바스크립트 코드를 실행할 수 있는 Nashorn 자바스크립트 엔진을 도입했습니다. 자바와 자바스크립트를 번역할 수 있는 이중어 친구처럼입니다!

import javax.script.*;

public class NashornExample {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

engine.eval("print('Hello from JavaScript!');");
}
}

이 코드 스니пет은 자바 프로그램 내에서 자바스크립트를 실행합니다. 얼마나 멋질까요?

마무리하자면, 자바 8은 코딩을 더 쉽고 효율적이고 재미있게 만드는 많은 흥미로운 기능을 제공합니다. 우리가 보았던 것처럼, 이 기능들은 단순한 장식이 아니라, 코드를 크게 개선할 수 있는 강력한 도구입니다.

기억하세요, 코딩하는 것은 여정입니다. 모든 것이 처음에는 이해가 되지 않을 수 있습니다. 꾸준히 연습하고 탐구하며, 가장 중요한 것은 즐기는 것입니다! 당신이 자바 마스터가 될 때까지, 행복하게 코딩하세요!

Credits: Image by storyset