자바 11의 새로운 기능과 업그레이드 가이드

자바 11: 새로운 기능 소개

자바 11은 2018년 9월에 출시된 자바의 최신 버전으로, 이전 버전들과 달리 오랜 기간 동안 지원되어 안정성과 보안성이 높은 버전이다. 이번 글에서는 자바 11에서 새로 추가된 기능들과 업그레이드 가이드를 소개한다.

지역 변수 유형 추론

지역 변수 유형 추론(Local Variable Type Inference)은 자바 10에서 처음 도입된 기능이지만, 자바 11에서 더욱 발전하여 사용할 수 있는 범위가 넓어졌다. 지역 변수 유형 추론을 사용하면 변수 유형을 명시하지 않고도 컴파일러가 유추하여 변수를 선언할 수 있다.

var list = new ArrayList(); // var 키워드를 사용하여 ArrayList을 유추한다.

하지만 var 키워드를 사용할 때 주의할 점이 있다. 변수를 선언할 때 초기값이 없으면 컴파일러가 변수 유형을 유추할 수 없으므로 오류가 발생한다. 또한, var 키워드를 사용하면 변수 유형을 명시적으로 선언하지 않기 때문에 가독성이 떨어질 수 있다는 단점도 있다.

HTTP 클라이언트 API

자바 11에서는 HTTP/2 지원, 비동기식 API, WebSocket, HTTP/1.1 호환성 등 다양한 기능을 갖춘 새로운 HTTP 클라이언트 API가 도입되었다. 이전에는 Apache HttpClient, OkHttp 등의 라이브러리를 사용해야 했지만, 이제는 자바에서 직접 HTTP 클라이언트를 구현할 수 있게 되었다.

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
        .GET()
        .build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

위 코드는 자바 11에서 제공되는 HTTP 클라이언트 API를 사용하여 JSONPlaceholder 사이트에서 첫 번째 게시물 정보를 가져오는 예제이다. HttpClient 클래스를 사용하여 HTTP 클라이언트를 생성하고, HttpRequest 클래스를 사용하여 요청을 생성한다. 마지막으로 HttpResponse 클래스를 사용하여 응답을 처리한다.

로우 레벨 스트림 API

자바 11에서는 기존의 스트림 API에 더하여 로우 레벨 스트림 API가 추가되었다. 이 기능은 NIO.2에서 제공되는 파일 I/O API와 연동하여 파일을 더욱 쉽게 처리할 수 있도록 도와준다.

try (var input = new FileInputStream("file.txt");
     var channel = input.getChannel();
     var buffer = ByteBuffer.allocate(1024)) {
    while (channel.read(buffer) > 0) {
        buffer.flip();
        while (buffer.hasRemaining()) {
            System.out.print((char) buffer.get());
        }
        buffer.clear();
    }
} catch (IOException e) {
    e.printStackTrace();
}

위 코드는 파일을 읽어들이는 예제로, FileInputStream 클래스를 사용하여 파일 입력 스트림을 생성하고, getChannel() 메서드를 사용하여 파일 채널을 생성한다. ByteBuffer 클래스를 사용하여 데이터를 읽고 출력한다.

람다 파라미터

자바 11에서는 람다 표현식의 파라미터로 var 키워드를 사용할 수 있다. 이전에는 람다 표현식의 파라미터를 모두 명시해야 했지만, 이제는 var 키워드를 사용하여 파라미터 유형을 생략할 수 있다.

BiFunction add = (var x, var y) -> x + y;

위 코드는 var 키워드를 사용하여 람다 표현식의 파라미터 유형을 생략한 예제이다. 자바 11에서는 람다 표현식의 파라미터에 var 키워드를 사용할 수 있지만, var 키워드를 사용할 때는 파라미터의 유형이 명확하게 유추될 수 있어야 한다.

불변 컬렉션

자바 11에서는 불변 컬렉션(Immutable Collection)이 추가되었다. 이전에는 Collections.unmodifiableXXX() 메서드를 사용하여 불변 컬렉션을 생성할 수 있었지만, 이제는 Collections 클래스의 새로운 메서드를 사용하여 불변 컬렉션을 생성할 수 있다.

List immutableList = List.of(1, 2, 3);

위 코드는 List.of() 메서드를 사용하여 불변 리스트를 생성하는 예제이다. 이 메서드로 생성된 불변 컬렉션은 요소를 추가, 삭제, 수정할 수 없으며, 예외가 발생하면 UnsupportedOperationException이 발생한다.

지역 변수의 상수 유형

자바 11에서는 final 키워드를 생략하고 var 키워드를 사용하여 상수 변수를 선언할 수 있다. 이를 통해 코드의 가독성을 높일 수 있으며, 상수 변수의 유형을 변경할 때도 코드를 수정하지 않아도 된다.

var PI = 3.141592;

위 코드는 var 키워드를 사용하여 상수 변수 PI를 선언하는 예제이다. 이 변수는 final 키워드를 생략하고 var 키워드를 사용하여 선언되었으며, 값을 변경할 수 없는 상수 변수이다.

문자열에서 빈 문자열 제거

자바 11에서는 문자열의 빈 문자열을 제거할 수 있는 strip() 메서드가 추가되었다. 이전에는 trim() 메서드를 사용하여 문자열의 공백 문자를 제거할 수 있었지만, 이제는 strip() 메서드를 사용하여 문자열의 양쪽 끝에 있는 빈 문자열도 제거할 수 있다.

String str = "  hello  ";
String stripped = str.strip();
System.out.println(stripped); // "hello"

위 코드는 strip() 메서드를 사용하여 문자열의 양쪽 끝에 있는 빈 문자열을 제거하는 예제이다. 이를 통해 문자열의 가독성을 높일 수 있으며, 문자열 처리를 더욱 효율적으로 할 수 있다.

컬렉션에서 랜덤 요소 가져오기

자바 11에서는 컬렉션에서 랜덤한 요소를 가져오는 메서드가 추가되었다. 이를 통해 컬렉션에서 랜덤한 값을 가져오는 코드를 더욱 간결하게 작성할 수 있다.

List list = Arrays.asList(1, 2, 3, 4, 5);
int random = ThreadLocalRandom.current().nextInt(list.size());
System.out.println(list.get(random));

위 코드는 ThreadLocalRandom 클래스를 사용하여 리스트에서 랜덤한 값을 가져오는 예제이다. 이를 통해 랜덤한 값을 사용하는 코드를 더욱 간결하게 작성할 수 있으며, 코드의 가독성을 높일 수 있다.

자바 11 업그레이드 가이드

자바 11으로 업그레이드하기 전에, 기존에 사용하던 자바 버전과의 호환성 문제를 고려해야 한다. 자바 11으로 업그레이드할 때 주의해야 할 점들을 살펴보자.

기존 코드의 호환성

자바 11은 이전 버전들과 호환성이 있지만, 일부 기능들은 더 이상 지원되지 않을 수도 있다. 예를 들어, 자바 11에서는 Java EE가 더 이상 지원되지 않으므로, 기존의 Java EE 관련 코드들은 수정되어야 할 수도 있다.

또한, 지역 변수 유형 추론과 같은 새로운 기능들은 이전 버전과 호환성이 없을 수 있다. 따라서 이전 버전에서 작성된 코드들이 자바 11에서 문제 없이 동작하는지 테스트해보는 것이 좋다.

모듈화

자바 9부터 도입된 모듈 시스템은 자바 11에서도 계속해서 사용된다. 모듈 시스템을 사용하면 프로그램을 더욱 모듈화하여 의존성 관리를 더욱 효율적으로 할 수 있다.

하지만, 모듈 시스템을 사용하면서 발생할 수 있는 문제들도 있다. 예를 들어, 모듈 간의 의존성이 복잡해질 경우 모듈 간의 충돌이 발생할 수 있다. 이를 방지하기 위해 모듈 간의 의존성을 잘 관리해야 한다.

버전 관리

자바 11에서는 새로운 버전 관리 시스템인 Semantic Versioning이 도입되었다. 이 시스템은 기존의 버전 관리 방식보다 더욱 명확하고 일관성 있는 버전 관리를 제공한다.

Semantic Versioning은 버전 번호를 MAJOR.MINOR.PATCH 형식으로 표현한다. MAJOR 버전은 하위 호환성을 깨는 변경 사항이 있을 때 증가하며, MINOR 버전은 하위 호환성을 유지하면서 기능을 추가할 때 증가한다. PATCH 버전은 하위 호환성을 유지하면서 버그를 수정할 때 증가한다.

IDE 지원

자바 11을 사용하기 위해서는 IDE도 업그레이드해야 한다. 대부분의 IDE에서는 자바 11을 지원하는 최신 버전을 제공하고 있으므로, IDE를 업그레이드하여 사용하는 것이 좋다.

모듈화와 성능 개선

자바 11에서 가장 큰 변화 중 하나는 모듈 시스템의 도입이다. 모듈 시스템은 프로그램을 더욱 모듈화하여 의존성 관리를 더욱 효율적으로 할 수 있도록 도와준다.

모듈 시스템을 사용하면 불필요한 클래스를 로딩하지 않아서 성능을 개선할 수 있다. 또한, 모듈 간의 의존성을 명확하게 정의하여 의존성 충돌을 방지할 수 있다.

module com.example.myapp {
    requires java.base;
    requires java.sql;
    requires java.xml;
    exports com.example.myapp;
}

위 코드는 모듈 시스템을 사용하여 자바 모듈을 정의하는 예제이다. requires 키워드를 사용하여 모듈 간의 의존성을 정의하고, exports 키워드를 사용하여 모듈을 외부에 공개한다.

지속적인 보안 강화: JEP 324, JEP 328

자바 11에서는 JEP 324와 JEP 328과 같은 보안 강화 기능들이 추가되었다. 이를 통해 자바 애플리케이션의 보안성을 높일 수 있다.

JEP 324: Key Agreement with Curve25519 and Curve448

JEP 324는 Curve25519 및 Curve448 알고리즘을 사용하여 키 협상을 수행하는 기능을 추가한다. 이를 통해 자바의 보안성을 높일 수 있으며, 새로운 암호화 방식을 사용하여 더욱 안전한 자바 애플리케이션을 작성할 수 있다.

JEP 328: Flight Recorder

JEP 328은 Java Flight Recorder(JFR)를 오픈소스로 공개하는 기능을 추가한다. JFR은 자바 애플리케이션의 성능 분석 및 디버깅에 사용되는 도구로, 자바 11에서는 기본으로 포함되어 있다.

이번에 오픈소스로 공개된 JFR을 사용하면, 더욱 다양한 운영체제에서 자바 애플리케이션의 성능 분석을 수행할 수 있다. 또한, JFR을 사용하여 애플리케이션의 문제를 신속하게 파악하고 해결할 수 있다.

결론

자바 11은 이전 버전들보다 안정성과 보안성이 높은 버전으로, 새로운 기능들과 보안 강화 기능들이 추가되어 있다. 이번 글에서는 자바 11에서 새로 추가된 기능들과 업그레이드 가이드를 소개하였다.

자바 11에서 추가된 기능들은 개발자들이 코드를 더욱 간결하게 작성하고, 더욱 효율적으로 작업할 수 있도록 도와준다. 또한, 모듈 시스템을 사용하여 프로그램을 더욱 모듈화하고, 보안 강화 기능을 사용하여 자바 애플리케이