Java

[Java] StringTokenizer 사용법 (기준에 따라 문자열 쪼개기)

feelcoding 2020. 2. 15. 01:58
728x90

StringTokenizer는 구분자를 기준으로 문자열을 분리하고 싶을 때 클래스이다.

구분자란 무엇일까?

"양파,당근,마늘,오이,상추"라는 문자열이 있을 때 콤마(,)를 기준으로 나누고 싶다면 콤마(,)가 구분자이다.

"2020년 02월 15일"이라는 문자열이 있을 때 공백을 기준으로 나누고 싶다면 공백이 구분자이다.

"2020-02-15"라는 문자열이 있을 때 '-' 문자를 기준으로 나누고 싶다면 구분자는 '-'이다.

 

일단 문자열을 쪼개고 싶다면 StringTokenizer 객체를 생성해야 한다. StringTokenizer 객체를 생성할 때에는 나누고 싶은 문자열과 구분자를 적어야 한다. 구분자를 적어주지 않으면 공백을 기준으로 나눈다.

String s = "2020년 2월 15일";
StringTokenizer tokenizer = new StringTokenizer(s); //공백을 기준으로 문자열 s를 나누기 위한 객체

공백을 기준으로 문자열을 나누고 싶다면 이렇게 생성자의 인자로 문자열만 넣어주면 된다.

 

String s = "2020-02-15";
StringTokenizer tokenizer = new StringTokenizer(s, "-");

특정 문자열을 기준으로 나누고 싶다면 문자열과 구분자를 생성자의 인자로 넣어주면 된다.

 

이렇게 StringTokenizer 객체를 생성하고 나면 문자열을 쪼개기 위한 준비작업은 다 끝났다.

이제 문자열을 나누면 된다.

 

일단 StringTokenizer 클래스의 메소드부터 살펴보자.

int countTokens() 남아있는 토큰의 개수를 반환한다.
boolean hasMoreTokens() 남아있는 토큰이 있으면 true, 더 이상 토큰이 없으면 false
String nextToken() 토큰을 꺼내온다.

https://docs.oracle.com/javase/10/docs/api/java/util/StringTokenizer.html

 

StringTokenizer (Java SE 10 & JDK 10 )

Constructs a string tokenizer for the specified string. All characters in the delim argument are the delimiters for separating tokens. If the returnDelims flag is true, then the delimiter characters are also returned as tokens. Each delimiter is returned a

docs.oracle.com

이 메소드들의 사용법은 직접 코드를 보면서 배우는 것이 가장 빠를 거라고 생각한다.

import java.util.StringTokenizer;

public class StringTokenizerTest {
    public static void main(String[] args) {
        String s = "2020-02-15";
        StringTokenizer tokenizer = new StringTokenizer(s, "-");
        System.out.println("토큰의 개수: " + tokenizer.countTokens());
        while(tokenizer.hasMoreTokens()) {
            System.out.println(tokenizer.nextToken());
            System.out.println("토큰의 개수: " + tokenizer.countTokens());
        }
    }
}

 

 

 

 

import java.util.StringTokenizer;

public class StringTokenizerTest {
    public static void main(String[] args) {
        String s = "안녕? 여기는 feelcoding 블로그야";
        StringTokenizer tokenizer = new StringTokenizer(s);
        System.out.println("토큰의 개수: " + tokenizer.countTokens());
        while(tokenizer.hasMoreTokens()) {
            System.out.println(tokenizer.nextToken());
        }
    }
}

 

위 코드의 실행 결과

 

 

 

import java.util.StringTokenizer;

public class StringTokenizerTest {
    public static void main(String[] args) {
        String s = "2020-02-15";
        StringTokenizer tokenizer = new StringTokenizer(s, "-");
        System.out.println("토큰의 개수: " + tokenizer.countTokens());
        while(tokenizer.hasMoreTokens()) {
            System.out.println(tokenizer.nextToken());
        }
    }
}

 

위 코드의 실행 결과

 

 

 

import java.util.StringTokenizer;

public class StringTokenizerTest {
    public static void main(String[] args) {
        String s = "2020-02-15";
        StringTokenizer tokenizer = new StringTokenizer(s, "-");
        System.out.println("토큰의 개수: " + tokenizer.countTokens());
        while(tokenizer.hasMoreTokens()) {
            System.out.println(tokenizer.nextToken());
            System.out.println("토큰의 개수: " + tokenizer.countTokens());
        }
        tokenizer.nextToken(); //다 소모한 객체에서 토큰을 뽑아내려고 시도. 예외 발생
    }
}

StringTokenizer 객체는 소모적이라서 한 번 사용하면 다시 사용할 수 없다.

다시 사용하고 싶다면 객체를 새로 만들어야 한다. 이미 소모한 객체에서 토큰을 꺼내려고 하면 다음과 같이 NoSuchElementException 예외가 발생한다.

 

위 코드의 실행결과. 예외가 발생한다.

 

13번째 줄에서 예외가 발생했다고 하는데 그것은 마지막 코드인 tokenizer.nextToken();이다.

따라서 nextToken() 메소드를 사용하기 전에는 반드시 if(객체.hasMoreTokens()) 또는 if(객체.countTokens() > 0)으로 체크해보고 토큰을 뽑아야 한다.

728x90