027 기수를 지정해 문자열을 부호 없는 수로 변환
부호 없는 산술 연산은 자바 8부터 지원하기 시작했다. Byte, Short, Integer, Long 클래스가 가장 큰 영향을 받았다.
자바에서는 양수를 표현하는 문자열을 parseUnsignedInt()와 parseUnsignedLong()의 JDK 8 메서드를 사용해 부호 없는 int와 long 타입으로 파싱할 수 있다. 예를 들어 문자열로 표현된 다음 정수를 보자.
String nri = "255500";
다음은 위 문자열을 기수 36(허용 가능한 최대 기수)으로 지정해 부호 없는 int 값으로 파싱하는 해법이다.
int result = Integer.parseUnsignedInt(nri, Character.MAX_RADIX);
첫 번째 인수는 수, 두 번째 인수는 기수다. 기수는 [2, 36] 또는 [Character.MIN_RADIX, Character.MAX_RADIX] 범위여야 한다.
기수가 10이면 아래처럼 간단히 할 수 있다(parseUnsignedInt() 메서드는 기수에 기본적으로 10을 적용한다).
int result = Integer.parseUnsignedInt(nri);
JDK 9부터 parseUnsignedInt()에 새 기능이 추가됐다. 문자열과 기수 외에 [beginIndex, endIndex] 범위 타입을 허용한다. 이제 이 범위 안에서 파싱이 이뤄진다. 다음은 범위를 [1, 3]으로 명시한 코드다.
int result = Integer.parseUnsignedInt(nri, 1, 4, Character.MAX_RADIX);
parseUnsignedInt() 메서드는 Integer.MAX_VALUE보다 큰 수를 표현하는 문자열을 파싱할 수 있다(Integer.parseInt()로 파싱하면 java.lang.NumberFormatException 예외를 던진다).
// Integer.MAX_VALUE + 1 = 2147483647 + 1 = 2147483648
int maxValuePlus1 = Integer.parseUnsignedInt("2147483648");
Info ≣ Long 클래스의 long 수에도 (parseUnsignedLong() 같은) 동일한 메서드 집합을 지원한다.