Study/java

[Java] String - codePointAt : 문자의 유니코드

codePointAt, codePointBefore, codePointCount는 코드 포인트(특정 문자에 매핑되는 숫자 - 유니코드)와 관련된 메소드입니다.

 

codePointAt(int index)

문자열의 index에 해당하는 문자를 숫자로 변환한 값을 리턴해주는 메소드입니다.

String s = "abcde";
System.out.println(s.codePointAt(2));

codePointAt 결과
codePointAt 결과

99가 나오는 이유는 2번째에 위치한 'c'의 아스키코드번호가 99이기 때문입니다.

 

String을 생성할 때 int[] codePoints를 사용하는 경우가 있습니다.

코드로 예시를 들면

int[] codePoints = {97, 98, 99, 100, 101};
System.out.println(new String(codePoints, 0, 5));

int[] codePoints를 문자열로 변환
int[] codePoints를 문자열로 변환

97 = 'a'부터 101 = 'e'까지 "abcde"가 반환됩니다.

 

문자의 아스키코드 번호를 알아내는 또 다른 방법으로, 문자를 int로 형변환하는 방식이 있습니다.

System.out.println("(int)'v' : " + (int)'v');

'v' 형변환

'v'의 아스키코드 번호인 118이 리턴됩니다.

문자열의 특정 위치에 있는 문자의 번호로 로직을 수행해야할 때 유용하게 쓸 수 있을 것 같습니다.

 

 

 

 

codePointBefore(int index)

인덱스의 이전에 있는 문자의 코드포인트를 반환합니다.

String s = "ABCDE";
System.out.println(s.codePointBefore(1));

codePointBefore 사용 결과
codePointBefore 사용 결과

 

1번째 문자는 'B'이기 때문에 이전문자인 'A'의 코드번호 65가 반환됩니다.

index에 0을 넣게 되면 이전 문자가 없기 때문에 예외가 발생합니다.

System.out.println("s.codePointBefore(0) : " + s.codePointBefore(0));

codePointAt 예외 발생
codePointAt 예외 발생

 

예제를 "ABCDE"로 해서 처음에는 단순히 아스키코드값에서 1을 뺀 값을 리턴하는것인가 생각합니다.

실제로는 인덱스 값에서 1을 뺀 위치의 문자 번호를 반환합니다.

1번째면 0번째, 7번째면 6번째..

 

이 메소드의 사용처를 찾아보다가 괜찮은 로직이 하나 생각나서 소개해 보려 합니다.

특정 인덱스의 문자가 이전 문자보다 큰지 작은지 판별하고 싶을 때 charAt으로 구현하면 다음과 같습니다.

String s = "TRHJDJ";
for(int i = 1; i < s.length(); i++) {
	if(s.charAt(i - 1) < s.charAt(i)) {
		System.out.println(s.charAt(i) + " is bigger than " + s.charAt(i - 1));
	}
}

charAt으로 구현
charAt으로 구현

 

이 로직을 codePointAt으로 구현하면 다음과 같습니다.

String s = "TRHJDJ";
for(int i = 1; i < s.length(); i++) {
	if(s.codePointBefore(i) < s.codePointAt(i)) {
		System.out.println((char)s.codePointAt(i) + " is bigger than " + (char)s.codePointBefore(i));
	}
}

codePointAt + codePointBefore
codePointAt + codePointBefore

 

두 로직의 결과는 같습니다.

charAt(index - 1)보다 codePointBefore코드가 더 좋아보이지는 않지만

다른 사례들도 찾아보다 보면 codePoint를 사용하는것이 더 나은 경우가 있지않을까.. 생각합니다.

 

codePointCount(int beginIndex, int endIndex)

시작점과 끝점을 받아서 해당 범위에 codepoint의 수를 반환하는 메소드입니다.

String s1 = "A     B";
System.out.println(s1.codePointCount(0, s1.length()));

String s2 = "AB";
System.out.println(s2.codePointCount(0, s2.length()));

codePointCount 사용 결과
codePointCount 사용 결과

공백도 아스키코드번호가 존재합니다.

그래서 공백을 포함하고있는 첫번째 코드의 경우 7을 반환합니다.