[기본 개념] 4 | (2.3) Java.util.StringToKenizer 클래스

728x90

[기본 개념] 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의 정석 (남궁 성)

728x90