본문 바로가기

Java/기본

[Java] 유용한 클래스 - StringTokenizer (update.2021-11-19)

개요

StringTokenizer 클래스는 지정된 String을 여러 token으로 분리할 수 있는 기능을 제공한다. 공식문서에 따르면 StringTokenizer 는 legacy class 이므로 되도록이면 String 의 .split() 메서드 혹은 java.util.regex 를 추천한다고 한다. 

 

주요 메서드

메서드 내용
int countTokens() 문자열에서 남아있는 토큰 개수
boolean hasMoreElements() 문자열에서 분리할 토큰이 남아있는지 여부
boolean hasMoreTokens() 문자열에서 분리할 토큰이 남아있는지 여부
Object nextElement() 다음 토큰을 문자열로 반환
String nextToken() 다음 토큰을 Object형태로 반환
String nextToken(String delim) delim 을 기준으로 다음 토큰을 반환
*참고 Delimiter : 구분자

비슷한 메서드가 여러개 보인다.

  • hasMoreElements() 메서드와 hasMoreTokens() 메서드는 동일한 기능을 수행한다
  • nextElement() 메서드와 nextToken() 메서드도 동일한 기능을 수행한다. 다만 리턴값의 형태(Object<-> String)만 차이가 있다.

 

 

StringTokenizer 를 사용하는 기본 형태는 아래와 같다.

     StringTokenizer st = new StringTokenizer("i love you so much");
     while (st.hasMoreTokens()) {
         System.out.println(st.nextToken());
     }

위 코드를 실행하면 주어진 문자열에서 공백을 기준으로 각 단어가 분리돼 출력되는 것이 확인된다.

 

코드

예제1)

public class Test01 {
    public static void main(String[] args) {
        String str = "i    love  you so                much";
        StringTokenizer st = new StringTokenizer(str);
        int count = st.countTokens();
        System.out.println("토큰 개수 = "+ count);
        while (st.hasMoreTokens()){
            System.out.print(st.nextToken() + " ");
        }
    }
}

 

구분자를 지정하지 않고 String만 매개값으로 넣는 경우 공백을 기준으로 리턴한다.

공백의 크기는 무시된다.

 

실행 결과

토큰 개수 = 5
i love you so much 

 

 

 

예제2)

public class Test01 {
    public static void main(String[] args) {
        String str01 = "2021/06/20";
        String str02 = "철수:영희:길동:영수";
        StringTokenizer st1 = new StringTokenizer(str01, "/");
        StringTokenizer st2 = new StringTokenizer(str02, ":");

        while(st1.hasMoreTokens()){
            System.out.print(st1.nextToken() + " ");
        }
        
        System.out.println();
        while(st2.hasMoreTokens()){
            System.out.print(st2.nextToken() + " ");
        }
    }
}

 

구분자를 지정해 구분할 수 있다.

 

 

실행결과

2021 06 20 
철수 영희 길동 영수 

 

 

 

예제3)

public class Test01 {
    public static void main(String[] args) {
        String str01 = "철수::영희:::::: ::길동:영수";
        StringTokenizer st1 = new StringTokenizer(str01, ":");

        while(st1.hasMoreTokens()){
            System.out.print(st1.nextToken() + " ");
        }
    }
}

 

구분자 사이에 값이 없는 경우 무시된다. 공백은 엄연히 존재하는 값이므로 처리된다.

 

 

실행 결과

철수 영희   길동 영수 

 

 

 

 

예제4)

public class Test01 {
    public static void main(String[] args) {
        String str01 = "철수::영희:::::: ::길동:영수";
        StringTokenizer st1 = new StringTokenizer(str01, ":", true);
        StringTokenizer st2 = new StringTokenizer(str01, ":", false);

        while(st1.hasMoreTokens()){
            System.out.print(st1.nextToken() + " ");
        }
        System.out.println();
        while(st2.hasMoreTokens()){
            System.out.print(st2.nextToken() + " ");
        }
    }
}

 

생성자에 3번째 값은 구분자를 넣을 것인지 여부이다. 

 

 

실행결과

철수 : : 영희 : : : : : :   : : 길동 : 영수 
철수 영희   길동 영수