소소한개발팁
Published 2023. 7. 9. 16:56
Java 11 컴퓨터 언어/Java Version
반응형

로컬 변수 문법 확장

Java 11에서는 지역 변수 문법이 확장되어 var 키워드를 메서드의 매개변수로 사용할 수 있게 되었습니다. 이를 통해 메서드 선언 시 매개변수의 타입을 생략할 수 있습니다.

 

public class Example {
    public static void main(String[] args) {
        greet("John");
    }

    private static void greet(var name) {
        System.out.println("Hello, " + name);
    }
}

 

HTTP 클라이언트 개선

Java 11에서는 java.net.http 패키지에 새로운 HTTP 클라이언트 API가 추가되었습니다. 이 API는 비동기 및 동기 요청 처리, WebSocket 지원, HTTP/2 및 WebSocket 프로토콜의 기능 활용 등을 포함하여 다양한 기능을 제공합니다.

 

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
    public static void main(String[] args) throws Exception {
        // HTTP 클라이언트 생성
        HttpClient httpClient = HttpClient.newHttpClient();

        // HTTP 요청 생성
        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI("https://api.example.com/data"))
                .GET()
                .build();

        // HTTP 요청 보내기 (비동기)
        httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .join();
    }
}

 

지역 변수 중복 선언 허용

Java 11에서는 동일한 블록 내에서 중복된 이름의 로컬 변수를 선언할 수 있게 되었습니다. 이전에는 중복된 변수 이름을 사용하면 컴파일 오류가 발생했지만, Java 11에서는 중복 선언이 가능하며 서로 다른 스코프를 가지게 됩니다.

 

public class Example {
    public static void main(String[] args) {
        int x = 10;
        
        {
            int y = 20;
            System.out.println("x: " + x + ", y: " + y);
            
            int x = 30;  // 중복된 이름의 로컬 변수 선언
            System.out.println("x: " + x + ", y: " + y);
        }
    }
}

 

Epsilon GC

Java 11에서는 실험적인 가비지 컬렉터인 Epsilon GC가 도입되었습니다. Epsilon GC는 메모리 할당 및 해제를 수행하지 않으며, 가비지 컬렉션을 수행하지 않습니다. 이를 통해 메모리 오버헤드를 크게 줄이고 가비지 컬렉션 관련 작업이 필요하지 않은 특정 시나리오에서 성능을 향상시킬 수 있습니다.

 

import java.util.ArrayList;
import java.util.List;

public class EpsilonGCExample {
    public static void main(String[] args) {
        List<byte[]> memory = new ArrayList<>();

        while (true) {
            memory.add(new byte[1_000_000]);  // 1MB 메모리 할당
            sleep(1000);  // 1초마다 메모리 할당
        }
    }

    private static void sleep(int milliseconds) {
        try {
            Thread.sleep(milliseconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

 

ZGC (Experimental) 

Java 11에서는 실험적인 가비지 컬렉터인 ZGC가 추가되었습니다. ZGC는 대규모 메모리 및 멀티코어 시스템에서 최대 10ms 이하의 일시 중지 시간을 제공하도록 설계된 가비지 컬렉터입니다. 이를 통해 매우 큰 힙 크기에서도 일관된 응답 시간을 유지할 수 있습니다.

 

import java.util.ArrayList;
import java.util.List;

public class ZGCExample {
    public static void main(String[] args) {
        List<byte[]> memory = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
            memory.add(new byte[100_000_000]);  // 100MB 메모리 할당
            System.out.println("Allocated memory: " + (i + 1) + "00MB");
        }

        System.gc();  // 가비지 컬렉션 실행

        System.out.println("Garbage collection completed.");
    }
}

 

Unicode 지원

Java 11은 Unicode 10.0.0을 지원합니다. 이로 인해 Java에서 사용 가능한 문자 집합이 확장되었고, 새로운 문자 및 기호를 사용할 수 있게 되었습니다.

 

public class Example {
    public static void main(String[] args) {
        System.out.println("Unicode Characters:");
        
        String smiley = "\uD83D\uDE03";
        System.out.println(smiley);  // 웃는 얼굴 이모지 출력
        
        String heart = "\u2764\uFE0F";
        System.out.println(heart);  // 하트 이모지 출력
    }
}

 

JVM에 대한 확장된 지원

Java 11에서는 JVM에 대한 다양한 확장 기능이 추가되었습니다. 이러한 기능은 도구 개발자, 라이브러리 개발자 및 JVM 구현자에게 유용한 기능을 제공합니다. 예를 들어, 신뢰할 수 있는 클래스 및 리소스를 로딩하는 데 사용되는 새로운 시스템 모듈 및 확장된 JVM 로깅 기능이 있습니다.

 

import jdk.internal.vm.annotation.Contended;
import jdk.internal.vm.annotation.Stable;

public class Example {
    @Stable
    private static String message = "Hello, Java 11!";
    
    @Contended
    private static long[] data = new long[100_000];
    
    public static void main(String[] args) {
        System.out.println(message);
        System.out.println("Data length: " + data.length);
    }
}

 @Stable 어노테이션은 message 필드에 적용되어 안정성을 나타냅니다. 이를 통해 JVM은 해당 필드를 안정적으로 취급하고 최적화 작업을 수행합니다.

 

@Contended 어노테이션은 data 배열에 적용되어 False Sharing을 방지합니다. 이를 통해 JVM은 다른 스레드 간의 메모리 충돌을 최소화하여 성능을 향상시킵니다.

 

반응형

'컴퓨터 언어 > Java Version' 카테고리의 다른 글

Java 10  (0) 2023.07.09
Java 9  (0) 2023.07.09
Java 8  (0) 2023.07.06
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!