HOWTO · Java
Java에서 Int 숫자의 개별 자릿수를 얻는 방법
정수의 자릿수를 추출하여 출력하는 네 가지 Java 접근 방식을 예제 및 입력 제한 사항과 함께 설명합니다.
이 페이지의 내용
양수 int의 각 자릿수를 원래 순서로 출력하려면 %와 /로 자릿수를 추출하거나, 숫자를 문자열로 변환해 각 문자를 확인할 수 있습니다. 이 글에서는 12223을 예제로 사용해 이러한 방법과 재귀를 이용한 방법을 살펴봅니다.
% (mod)를 사용해 주어진 정수의 나머지 구하기
양수에서 % 10은 가장 오른쪽 자릿수를 반환하고 / 10은 그 자릿수를 제거합니다. 따라서 자릿수는 오른쪽에서 왼쪽 순서로 추출됩니다. 각 나머지를 LinkedList 스택에 저장한 뒤 값을 꺼내면 원래 순서대로 출력할 수 있습니다. 이 예제는 양수 int를 대상으로 하므로 0과 음수는 별도로 처리해야 합니다.
남은 값이 0이 되면 반복문이 끝나기 때문에, 입력이 0이면 목록이 비어 있어 자릿수가 출력되지 않습니다. 0도 유효한 입력이라면 0을 출력하는 예외 처리를 추가하세요. Java에서 음수의 나머지는 음수일 수 있으므로 이 반복문만으로 부호가 있는 수를 일반적으로 처리할 수는 없습니다. 먼저 부호를 저장하고 절댓값을 처리할 수 있지만, 양의 크기를 int로 표현할 수 없는 Integer.MIN_VALUE는 주의해야 합니다. 이 값도 포함될 수 있는 int라면 long으로 크기를 처리하거나 문자열 기반 방법을 선택하세요. 이 산술 방식은 자릿수를 숫자 값으로 바로 얻을 수 있어, 예를 들어 자릿수의 합을 계산할 때 유용합니다.
다음 예제를 실행해 보세요:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
int number = 12223;
LinkedList<Integer> digits = new LinkedList<>();
while (number > 0) {
digits.push(number % 10);
number /= 10;
}
while (digits.size() > 0) {
System.out.println(digits.pop());
}
}
}
1
2
2
2
3
String.toCharArray()를 사용해 문자 배열 얻기
정수를 문자열로 변환한 다음 toCharArray()를 호출하면 자릿수마다 문자 하나를 얻을 수 있습니다. '2'와 같은 char는 문자이며 숫자 값 2와는 다릅니다. 계산에 정수 자릿수가 필요하면 Character.digit을 사용하세요. 이 예제는 양수를 대상으로 하므로 결과 배열에는 숫자만 들어 있습니다.
이 방법은 입력에 표시된 자릿수 순서를 유지하며, 유효성 검사나 형식 지정에도 쉽게 응용할 수 있습니다. 숫자 계산을 할 때는 Character.digit(digit, 10)으로 각 십진 숫자 문자를 정수 값으로 바꿀 수 있습니다. 원본에 숫자가 아닌 문자가 들어갈 수 있다면 반환값이 음수인지 확인하세요. 음수를 문자열로 변환하면 첫 문자로 '-'가 포함되므로, 부호를 자릿수로 취급하지 말고 건너뛰거나 별도로 처리해야 합니다. 0은 한 문자로 된 문자열 "0"으로 변환되므로 이 방법에서는 자릿수가 그대로 유지됩니다. int의 범위는 제한되어 있으므로, 변환 결과에는 해당 값의 전체 십진 표기가 담깁니다. 더 큰 숫자 자료형의 자릿수나 입력 문자열에 있던 선행 0까지 얻는 것은 아닙니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
public class Main {
public static void main(String[] args) {
int number = 12223;
char[] digits = String.valueOf(number).toCharArray();
for (char digit : digits) {
System.out.println(Character.digit(digit, 10));
}
}
}
1
2
2
2
3
number.split("(?<=.)") 메서드로 문자열 배열을 얻어 분리하기
String.split은 문자열 배열을 반환합니다. 정규식 (?<=.)은 문자 바로 뒤의 위치와 일치하므로, 양수의 문자열을 자릿수마다 문자열 하나씩으로 나눕니다. 숫자가 음수라면 부호도 배열 요소가 됩니다. 문자열이 아닌 문자를 얻으려는 경우에는 보통 toCharArray()가 더 간단합니다.
배열의 각 요소는 문자열로 남으므로, 이후 계산에 정수 값이 필요할 때만 요소를 파싱하세요. 문자열 변환 결과는 0일 때 "0"이 되고, 음수일 때는 맨 앞에 부호 요소가 온 다음 자릿수가 이어집니다. 자릿수를 파싱하기 전에 부호를 걸러내세요. 이후 작업에서 문자열을 이미 사용한다면 이 정규식이 편리할 수 있지만, 정규식과 배열 처리 비용이 추가되며 단순히 문자를 순회할 때 toCharArray()보다 나은 점은 없습니다. 다른 정수-문자열 변환 방식과 마찬가지로 숫자 값의 표기만 다루므로 원래 int에 없던 선행 0은 복원할 수 없습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
public class Main {
public static void main(String[] args) {
int number1 = 12223;
String number = String.valueOf(number1);
String[] digits = number.split("(?<=.)");
for (String digit : digits) {
System.out.println(digit);
}
}
}
1
2
2
2
3
재귀를 사용해 정수의 자릿수 분리하기
양수를 10으로 나누는 작업을 값이 0이 될 때까지 재귀적으로 반복합니다. 재귀 호출이 반환된 뒤 각 나머지를 출력하면 가장 왼쪽 자릿수가 먼저 출력됩니다. 이 예제는 0일 때 아무것도 출력하지 않고 음수도 처리하지 않으므로, 애플리케이션에서 그런 값이 유효하다면 명시적으로 처리해야 합니다.
종료 조건이 기저 사례입니다. 나눗셈 결과가 0에 이르면 호출이 출력 없이 반환되고, 대기 중이던 호출들이 되돌아오면서 저장해 둔 나머지를 출력합니다. 별도의 컬렉션 없이 호출 스택이 추출 순서를 뒤집어 줍니다. 입력이 0이면 첫 호출에서 조건이 거짓이므로 직접 출력하는 처리를 추가하세요. 음수라면 재귀 호출 전에 부호를 처리해 출력하고, 안전한 크기로 재귀를 진행해야 합니다. 가능한 모든 int를 허용한다면 Integer.MIN_VALUE도 고려하세요. 재귀는 작은 정수로 원리를 설명할 때 이해하기 쉽지만, 반복문은 확장하기가 대체로 간단하며 자릿수마다 스택 프레임을 사용하지 않습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
public class Main {
public static void main(String[] args) {
recursion(12223);
}
public static void recursion(int number) {
if (number > 0) {
recursion(number / 10);
System.out.println(number % 10);
}
}
}
1
2
2
2
3