자바 10 - 새로운 기능

안녕하세요, 자바 개발자 지망생 여러분! 자바 10의 흥미로운 새로운 기능을 안내해드리게 되어 기쁩니다. 자바를 오랫동안 가르쳐온 사람으로서, 이 업데이트가 여러분의 코딩 여정을 더욱 즐겁고 효율적으로 만들 것이라 확신합니다. 시작해보겠습니다!

Java 10 - New Features

자바 10 소개

자바 10은 2018년 3월에 출시되어 언어에 여러 개선 사항을 제공했습니다. 다른 버전만큼 혁신적이지는 않지만, 코딩 경험을 크게 향상시킬 수 있는 몇 가지 유용한 기능을 도입했습니다.

로컬 변수 타입 추론

자바 10에서 가장 많이 언급된 기능 중 하나는 로컬 변수 타입 추론입니다. 이 기능을 통해 로컬 변수를 선언할 때 타입을 명시하지 않고도 선언할 수 있습니다. 대신 var 키워드를 사용하면 컴파일러가 초기화자에 기반하여 타입을 추론합니다.

예제를 보겠습니다:

// 자바 10 이전
String message = "Hello, Java 10!";

// 자바 10과 함께
var message = "Hello, Java 10!";

이 예제에서 컴파일러는 messageString이라는 것을 자동으로 추론합니다. 이 기능은 복잡한 타입을 다루는 데 특히 코드를 간결하고 가독성 있게 만들 수 있습니다.

var 사용 시기

var은 강력한 기능이지만, 신중하게 사용해야 합니다. 다음 가이드라인을 참고하세요:

  1. 할당의 오른쪽에서 타입이 명확한 경우 var을 사용합니다.
  2. 타입이 명확하지 않은 경우 var을 사용하지 마세요. 코드 가독성을 저하시킬 수 있습니다.

보다 복잡한 예제를 보겠습니다:

// 자바 10 이전
Map<String, List<String>> userFruits = new HashMap<>();

// 자바 10과 함께
var userFruits = new HashMap<String, List<String>>();

이 경우 var을 사용하면 코드가 깨끗해지면서도 명확성을 유지합니다.

향상된 API

자바 10은 기존 API에 몇 가지 개선 사항을 도입했습니다. 몇 가지를 탐구해보겠습니다.

Optional.orElseThrow()

자바 8에서 도입된 Optional 클래스는 자바 10에서 새로운 메서드 orElseThrow()를 얻었습니다. 이 메서드는 get()과 유사하지만, Optional이 비어 있을 때 예외를 던지는 점이 더 명확합니다.

public class OptionalExample {
public static void main(String[] args) {
Optional<String> emptyOptional = Optional.empty();

try {
String result = emptyOptional.orElseThrow();
} catch (NoSuchElementException e) {
System.out.println("Optional이 비어 있습니다!");
}
}
}

이 예제에서 orElseThrow()는 Optional이 비어 있기 때문에 NoSuchElementException을 던집니다. 이 메서드는 코드를 더 표현력 있고 이해하기 쉽게 만들어줍니다.

불변 컬렉션

자바 10은 컬렉션의 불변 사본을 생성하는 새로운 팩토리 메서드를 도입했습니다. 이 메서드는 List, Set, Map에 대해 사용할 수 있습니다.

public class UnmodifiableCollectionsExample {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");
List<String> unmodifiableFruits = List.copyOf(fruits);

try {
unmodifiableFruits.add("Date");
} catch (UnsupportedOperationException e) {
System.out.println("불변 리스트를 수정할 수 없습니다!");
}
}
}

이 예제에서 List.copyOf()는 원래 리스트의 불변 사본을 생성합니다. 이 리스트를 수정하려는 시도는 UnsupportedOperationException을 발생시킵니다.

성능 개선

자바 10은 성능을 향상시키는 몇 가지 배후 개선 사항을 도입했습니다.

G1의 병렬 전체 GC

Garbage-First (G1) 가비지 컬렉터는 자바 9에서 기본으로 설정되었으며, 자바 10에서 전체 GC가 병렬로 처리되도록 업그레이드되었습니다. 이는 대형 힙에서 중지 시간을 크게 줄일 수 있습니다.

여러분의 코드와 직접 상호작용할 수는 없지만, 자바 애플리케이션이 더 빠르고 효율적으로 실행될 수 있다는 점을 알아두세요.

애플리케이션 클래스 데이터 공유

자바 10은 기존의 Class-Data Sharing (CDS) 기능을 확장하여 애플리케이션 클래스를 공유 아카이브에 배치할 수 있도록 했습니다. 이는 시작 시간을 단축하고 메모리 푸트를 줄일 수 있습니다, 특히 동일한 기계에서 여러 JVM이 동일한 애플리케이션을 실행할 때 더욱 그렇습니다.

이 기능을 사용하려면 특정 JVM 인수를 사용하여 애플리케이션을 실행해야 합니다. 예를 들어:

# 단계 1: 공유 아카이브 생성
java -Xshare:dump -XX:+UseAppCDS -XX:DumpLoadedClassList=classes.lst -cp myapp.jar MyApp

# 단계 2: 공유 아카이브를 사용하여 애플리케이션 실행
java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=classes.jsa -cp myapp.jar MyApp

이 기능은 마이크로서비스와 컨테이너 기반 애플리케이션에서 빠른 시작 시간이 중요한 경우 유용합니다.

결론

자바 10은 상대적으로 작은 배포이지만, 코딩 경험을 향상시킬 수 있는 몇 가지 중요한 기능을 제공합니다. 로컬 변수 타입 추론의 편리함에서 G1 가비지 컬렉터의 병렬 전체 GC와 애플리케이션 클래스 데이터 공유의 성능 개선까지, 이 기능들은 자바를 더 효율적이고 개발자 친화적인 언어로 만듭니다.

이 기능들을 배우는 가장 좋은 방법은 실습입니다. 프로젝트에 이를 통합해보면 얼마나 코드를 개선할 수 있는지 쉽게 확인할 수 있습니다. 행복한 코딩 되세요, 여러분의 자바 여정이 흥미로운 발견으로 가득 차기를 바랍니다!

Credits: Image by storyset