자바(SE)

[JDK] 버전별 특징 - JDK12

은서파 2023. 5. 22. 17:22

이번 포스트에서는 JDK12에서 달라진 점을 살펴보자. 

이 버전도 크게 주목 받을 만한 내용은 추가되지 않았다.

 

추가된 API들

 

String 클래스 메서드 강화

  • indent: String 출력 시 들여쓰기를 위한 indent가 추가되었다. 초기 위치를 0이라고 했을 때 양수는 우측으로, 음수는 좌측으로 이동하는데 처음 위치보다 왼쪽으로 갈 수는 없다.(무시됨)
@Test
public void indentTest(){
    String text = "Hello Java!\nJDK 12 is comming!";
    text = text.indent(4);
    System.out.println(text);

    text = text.indent(-10);
    System.out.println(text);
}

이때 출력된 결과는 다음과 같다. 좌측은 4칸의 공백이 삽입되었고 10칸을 다시 왼쪽으로 보냈지만 추가된 4개의 공백만 제거된 것을 볼 수 있다.

    Hello Java!
    JDK 12 is comming!
Hello Java!
JDK 12 is comming!

 

  • transform: 문자열을 Function 타입의 식에 집어 넣어 새로운 형태로 변환할 때 사용된다.
@Test
@DisplayName("transform은 Function 계열을 받으므로 문자열을 새로운 타입으로 변환할 수 있다.")
public void transformStringTypeTo() {
    String text = "Hello";

    StringBuilder transformed = text.transform(value ->
        new StringBuilder(value).reverse()
    );

    Assertions.assertEquals("olleH", transformed.toString());
}

어디다 써야할까? ㅜㅜ 원래 사용하던 방식 대비 뭐가 좋아진거지..

 Teeing Collector 추가

teeing은 골프 용어인데 공을 티에 올려놓는 과정을 이야기 한다. JDK 12에 추가된 Teeing Collector는 두 개의 Collector들을 래핑하고 그 결과를 병렬로 수집하는데 사용되는 Collector 이다.

@Test
@DisplayName("Teeing Collector - 두 개의 스트림 Collector를 모아서 사용하는 Collector")
public void teeingCollector() {
    Stream<Integer> intStream = Stream.of(1, 2, 3, 4, 5, 6, 7);
    double avg = intStream.collect(
                         Collectors.teeing(Collectors.counting(),         // Collector 1
                                           Collectors.summingInt(i -> i), // Collector 2 
                                           (cnt, sum) -> sum*1.0 / cnt)); // 병합
    Assertions.assertEquals(avg, 4.0);
}

 

 

Compact Number Formatting

숫자에 대한 formatting을 간단히 출력하기 위한 CompactNumberFormat이 추가되었다. 숫자에 대한 compact한 표현은 예를 들면 2,000을 2천 이라고 표현하는 형태이다. 

NumberFormat.Style.SHORT와 NumberFormat.Style.LONG에  따라 출력 형태가 다른데 US locale에서는 첫 단위에서는 각각 K와 thousand, 백만 단위에서는 M과 million, 억 단위는 B와 billion이 사용된다. 한글은 Short와 Long 구별 없이 천, 만, 억이다.

@Test
public void numberFormat() {
    long num = 123456789;
    Locale locale = Locale.KOREAN;
    locale = Locale.US;
    NumberFormat likesShort =
            NumberFormat.getCompactNumberInstance(locale, NumberFormat.Style.SHORT);
    likesShort.setMaximumFractionDigits(2);
    Assertions.assertEquals("123.46M", likesShort.format(num));

    NumberFormat likesLong =
            NumberFormat.getCompactNumberInstance(locale, NumberFormat.Style.LONG);
    likesLong.setMaximumFractionDigits(2);
    Assertions.assertEquals("123.46 million",likesLong.format(num));
}