Java의 StringTokenizer 클래스는 Object 클래스의 하위 클래스로, 하나의 문자열을 여러 개의 토큰(token)으로 분리하는 기능을 제공합니다. 구분자(delimiter)는 객체 생성 시점에 지정하거나, 토큰을 가져올 때마다 개별적으로 지정할 수도 있습니다.
StringTokenizer의 동작 방식
StringTokenizer 인스턴스는 생성 시 returnDelims 플래그 값이 true인지 false인지에 따라 두 가지 방식으로 동작합니다. 또한 StringTokenizer 객체는 내부적으로 분리 대상 문자열 내에서 현재 위치(current position)를 유지하며, 이를 통해 순차적으로 토큰을 읽어갑니다.
StringTokenizer 클래스에서 자주 사용되는 핵심 메서드는 다음과 같습니다.
- hasMoreElements() : 처리할 요소가 더 있는지 확인합니다.
- hasMoreTokens() : 남은 토큰이 있는지 확인합니다.
- nextElement() : 다음 요소를 Object 타입으로 반환합니다.
- nextToken() : 다음 토큰을 String 타입으로 반환합니다.
- countTokens() : 남아 있는 토큰의 총 개수를 반환합니다.
클래스 선언(문법)
public class StringTokenizer extends Object implements Enumeration<Object>
예제 1: 기본적인 공백 기준 토큰 분리
구분자를 별도로 지정하지 않으면 기본적으로 공백 문자를 기준으로 문자열이 분리됩니다.
import java.util.*;
public class StringTokenizerTest1 {
public static void main(String args[]) {
StringTokenizer tokens = new StringTokenizer("Welcome To Tutorials Point");
System.out.println("countTokens : " + tokens.countTokens());
while(tokens.hasMoreTokens()) {
System.out.println(tokens.nextToken());
}
}
}실행 결과
countTokens : 4 Welcome To Tutorials Point
위 예제에서는 문자열에 포함된 단어가 4개이므로 countTokens() 메서드가 4를 반환하고, while 반복문과 hasMoreTokens(), nextToken() 메서드를 조합하여 각 단어를 순서대로 출력합니다.
예제 2: 특정 구분자 지정하기
nextToken(String delim) 메서드에 구분자를 직접 전달하면 해당 문자를 기준으로 토큰을 분리할 수 있습니다.
import java.util.*;
public class StringTokenizerTest1 {
public static void main(String args[]) {
StringTokenizer tokens = new StringTokenizer("Welcome-To-Tutorials;Point-India;Hyderabad");
System.out.println("countTokens : " + tokens.countTokens());
while(tokens.hasMoreTokens()) {
System.out.println(tokens.nextToken(";"));
}
}
}실행 결과
countTokens : 1 Welcome-To-Tutorials Point-India Hyderabad
위 예제에서는 세미콜론(;)을 구분자로 지정했기 때문에, 생성 시점에는 하이픈(-)까지 모두 하나의 문자열로 계산되어 countTokens()가 1을 반환합니다. 하지만 실제로 nextToken(";")을 호출하면 세미콜론을 기준으로 세 개의 그룹으로 분리되어 출력됩니다.
정리
StringTokenizer는 간단한 문자열 분리 작업에 유용한 레거시 클래스입니다. 다만 최신 Java 코드에서는 정규표현식을 활용할 수 있는 String.split() 메서드나 보다 유연한 Stream API를 사용하는 것이 권장되므로, 상황에 맞게 선택하여 사용하는 것이 좋습니다.