[기본 개념] 4 | (2.3) Java.util.StringToKenizer 클래스
1 java.util.Objects클래스
2 java.util.Random클래스
3 정규식(Regular Expression) - java.util.regex패키지
4 java.util.Scanner클래스
5> java.util.StringTokenizer클래스
6 java.math.BigInteger클래스
7 java.math.BigDecimal클래스
5. java.util.StringTokenizer클래스
StringTokeinzer는 긴 문자열로 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개의 문자열로 잘라내는 데 사용된다.
예를 들어 "100,200,300,400"이라는 문자열이 있을 때, ','를 구분자로 잘라내면 "100", "200", "300", "400"이라는 4개의 문자열(토큰)을 얻을 수 있다.
String의 split(String regex)나 Scanner의 useDelimiter(String pattern)를 사용할 수도 있지만, 이는 정규식 표현을 사용해야하므로 간단한 StringTokenizer를 사용하는 것이 나을 수도 있다. 하지만 StringTokenizer는 구분자로 단 하나의 문자밖에 사용하지 못해서 복잡한 형태에는 사용하지 못한다.
StringTokenizer의 생성자와 메서드
주로 사용되는 생성자와 메서드다.
생성자 / 메서드 | 설명 |
StringTokenizer(String str, String delim) | 문자열을 지정된 구분자로 나누는 StringTokenizer를 생성한다. (구분자는 토큰으로 간주되지 않음) |
StringTokenizer(String str, String delim, boolean returnDelims) | 문자열을 지정된 구분자로 나누는 StringTokenizer를 생성한다. returnDelims의 값을 true로 하면 구분자도 도큰으로 간주된다. |
int countTokens( ) | 전체 토큰의 수를 반환한다. |
boolean hasMoreTokens( ) | 토큰이 남아있는지 알려준다. |
String nextToken( ) | 다음 토큰을 반환한다. |
예제/StringTokenizerEx3.java
import java.util.*;
public class StringTokenizerEx3 {
public static void main(String[] args) {
String source = "1,김천재,100,100,100|2,박수재,95,80,90|3,이자바,80,90,90";
StringTokenizer st = new StringTokenizer(source, "|");
while (st.hasMoreTokens()) {
String token = st.nextToken();
StringTokenizer st2 = new StringTokenizer(token, ",");
while (st2.hasMoreTokens())
System.out.println(st2.nextToken());
System.out.println("---------");
}
}
}
실행결과
1
김천재
100
100
100
---------
2
박수재
95
80
90
---------
3
이자바
80
90
90
---------
문자열에 포함된 데이터가 두 가지 종류의 구분자로 나눠져 있을 때 두 개의 StringTokenizer와 이중 반복문을 사용해서 처리했다.
예제/StringTokenizerEx4.java
import java.util.*;
public class StringTokenizerEx4 {
public static void main(String[] args) {
String input = "삼십만삼천백십오";
System.out.println(input);
System.out.println(hangulToNum(input));
}
public static long hangulToNum(String input) { // 한글을 숫자로 바꾸는 메서드
long result = 0; // 최종 변환결과를 저장하기 위한 변수
long tmpResult = 0; // 십백천 단위의 값을 저장하기 위한 임시변수
long num = 0;
final String NUMBER = "영일이삼사오육칠팔구";
final String UNIT = "십백천만억조";
final long[] UNIT_NUM = {10, 100, 1000, 10000, (long)1e8, (long)1e12};
StringTokenizer st = new StringTokenizer(input, UNIT, true);
while (st.hasMoreTokens()) {
String token = st.nextToken();
int check = NUMBER.indexOf(token); // 숫자인지, 단위(UNIT)인지 확인
if (check == -1) { // 단위인 경우
if ("만억조".indexOf(token) == -1) {
tmpResult += (num != 0 ? num : 1) * UNIT_NUM[UNIT.indexOf(token)];
} else {
tmpResult += num;
result += (tmpResult != 0 ? tmpResult : 1)
* UNIT_NUM[UNIT.indexOf(token)];
tmpResult = 0;
}
num = 0;
} else { // 숫자인 경우
num = check;
}
}
return result + tmpResult + num; // 300000 + 3110 + 5
}
}
실행결과
삼십만삼천백십오
303115
이 예제는 한글로 된 숫자를 아라비아 숫자로 변환하는 예제이다.
먼저 tmpResult는 "만억조"와 같은 큰 단위가 나오기 전까지 "십백천" 단위의 값을 저장하기 위한 임시공간이고, result는 실제 결과값을 저장하기 위한 공간이다. 그리고 한글로 된 숫자를 구분자(단위)로 잘라서, 토큰이 숫자면 num에 저장하고 단위면 num에다가 UNIT_NUM배열중 한 값을 곱해서 tmpResult에 저장한다.
출처 | Java의 정석 (남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 5 | (1.1) Calendar, Date (0) | 2021.11.30 |
---|---|
[기본 개념] 4 | (2.4) Java.math.BigInteger 클래스, Java.math.BigDecimal 클래스 (0) | 2021.11.30 |
[기본 개념] 4 | (2.2) Java.util.regex 패키지, Java.util.Scanner 클래스 (0) | 2021.11.29 |
[기본 개념] 4 | (2.1) Java.util.Object 클래스, Java.util.Random 클래스 (0) | 2021.11.29 |
[기본 개념] 4 | (1.6) Wrapper 클래스 (0) | 2021.11.29 |