Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9에서 String 클래스에 새로 추가된 메서드: chars()와 codePoints()

Java에서 String불변(immutable) 클래스입니다. Java 9에서는 String 클래스에 두 가지 유용한 메서드가 새롭게 추가되었는데, 바로 chars()codePoints()입니다. 두 메서드 모두 IntStream 객체를 반환하기 때문에, Java 8부터 도입된 Stream API와 함께 활용하면 문자열을 더욱 간결하고 직관적으로 처리할 수 있습니다.

1) chars()

chars() 메서드는 문자열을 구성하는 각 char 값을 확장(zero-extension)한 int 값들의 스트림을 반환합니다. 즉, 문자 하나하나를 정수 코드 값으로 변환해 순차적으로 접근할 수 있으며, 람다 표현식과 함께 사용하면 반복 처리가 매우 간편해집니다.

문법

public IntStream chars()

예제

import java.util.stream.IntStream;

public class StringCharsMethodTest {
   public static void main(String args[]) {
      String str = "Welcome to TutorialsPoint";
      IntStream intStream = str.chars();
      intStream.forEach(x -> System.out.printf("-%s", (char)x));
   }
}

실행 결과

-W-e-l-c-o-m-e- -t-o- -T-u-t-o-r-i-a-l-s-P-o-i-n-t

위 예제에서 볼 수 있듯이, chars()로 얻은 IntStream을 순회하면서 각 int 값을 다시 char 타입으로 캐스팅하면 원래 문자를 그대로 출력할 수 있습니다.

2) codePoints()

codePoints() 메서드는 문자열에 포함된 유니코드 코드 포인트(code point) 값들의 스트림을 반환합니다. 특히 한글이나 이모지처럼 하나의 문자가 여러 개의 char(서러게이트 페어)로 표현되는 경우에도, 이 메서드는 각각의 완전한 코드 포인트 단위로 처리할 수 있다는 점에서 chars()보다 더 안정적입니다.

문법

public IntStream codePoints()

예제

import java.util.stream.IntStream;

public class StringCodePointsMethodTest {
   public static void main(String args[]) {
      String str = "Welcome to Tutorix";
      IntStream intStream = str.codePoints();
      intStream.forEach(x -> System.out.print(new StringBuilder().appendCodePoint(x)));
   }
}

실행 결과

Welcome to Tutorix

위 예제에서는 StringBuilder의 appendCodePoint() 메서드를 활용해 코드 포인트 값을 다시 문자열로 변환하여 출력했습니다.

chars()와 codePoints()의 차이점 정리

두 메서드 모두 문자열을 IntStream으로 변환한다는 점은 동일하지만, 다음과 같은 차이가 있습니다.

  • chars(): 각 char 값(UTF-16 코드 유닛)을 기준으로 스트림을 생성합니다. 대부분의 영문·숫자 문자에는 문제가 없지만, 서러게이트 페어로 표현되는 보조 문자는 분리되어 처리될 수 있습니다.
  • codePoints(): 유니코드 코드 포인트 단위로 스트림을 생성하므로, 이모지나 희귀 한자 같은 보조 문자도 하나의 완전한 문자로 올바르게 처리됩니다.

따라서 일반적인 ASCII 문자열 처리에는 chars()로 충분하지만, 다국어 문자나 이모지 등 유니코드 전체 범위를 다루는 애플리케이션에서는 codePoints()를 사용하는 것이 권장됩니다.