자바 10 - 새로운 기능
안녕하세요, 자바 개발자 지망생 여러분! 자바 10의 흥미로운 새로운 기능을 안내해드리게 되어 기쁩니다. 자바를 오랫동안 가르쳐온 사람으로서, 이 업데이트가 여러분의 코딩 여정을 더욱 즐겁고 효율적으로 만들 것이라 확신합니다. 시작해보겠습니다!
자바 10 소개
자바 10은 2018년 3월에 출시되어 언어에 여러 개선 사항을 제공했습니다. 다른 버전만큼 혁신적이지는 않지만, 코딩 경험을 크게 향상시킬 수 있는 몇 가지 유용한 기능을 도입했습니다.
로컬 변수 타입 추론
자바 10에서 가장 많이 언급된 기능 중 하나는 로컬 변수 타입 추론입니다. 이 기능을 통해 로컬 변수를 선언할 때 타입을 명시하지 않고도 선언할 수 있습니다. 대신 var
키워드를 사용하면 컴파일러가 초기화자에 기반하여 타입을 추론합니다.
예제를 보겠습니다:
// 자바 10 이전
String message = "Hello, Java 10!";
// 자바 10과 함께
var message = "Hello, Java 10!";
이 예제에서 컴파일러는 message
가 String
이라는 것을 자동으로 추론합니다. 이 기능은 복잡한 타입을 다루는 데 특히 코드를 간결하고 가독성 있게 만들 수 있습니다.
var
사용 시기
var
은 강력한 기능이지만, 신중하게 사용해야 합니다. 다음 가이드라인을 참고하세요:
- 할당의 오른쪽에서 타입이 명확한 경우
var
을 사용합니다. - 타입이 명확하지 않은 경우
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