긴 문자열을 지정된 구분자delimeter
를 기준으로 토큰token
이라는 여러 개의 문자열로 잘라내는데 사용되는 클래스에요. "100,200,300,400"
을 ,
로 잘ㄹ라 내면 "100", "200", "300", "400"
이라는 4개의 문자열로 얻을 수 있어요.
StringTokenizer st = new StringTokenizer("100,200,300,400", ",");
// 이것도 되긴한데, 정규식 표현을 써야해서
// 익숙하지 않으면 StringTokenizer가 쓰기 편할거에요.
// String[] result = "100,200,300,400".split(",");
// Scanner sc = new Scanner("100,200,300,400").useDelimiter(",");
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
위 예제는 구분자는 무시하게 되는데, 생성자 StringTokenizer({문자열}, {구분자}, true /* 구분자 포함 */)
을 사용하시면 구분자까지 결과물에 포함시킬 수 있어요. 또한, {구분자}
의 경우, 하나만 사용할 수 있기 때문에 모든 문자열 전체가 하나의 구분자가 아닌 각각의 문자가 모두 구분자가 될 수 있어요.
String expression = "x=100*(200+300)/2";
StringTokenizer st = new StringTokenizer(expression, "=*(+)/", true);
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
마지막으로, String.split
함수와 비교해 볼게요. split
은 빈 문자열도 토큰으로 인식하는 반면, StringTokenizer
는 빈 문자열을 토큰으로 인식하지 않아요.
이 밖에도 성능적인 면에서 split
은 데이터를 토큰으로 잘라낸 결과를 배열에 담아 반환하기 때문에, 데이터를 토큰으로 바로 잘라서 반환하는 StringTokenizer
보다 성능이 떨어질 수 밖에 없어요. 데이터가 많은 경우라면 이를 고려해서 사용하시면 좋을 거에요.
String data = "100,,,200,300";
String[] result = data.split(",");
StringTokenizer st = new StringTokenizer(data, ",");
for(int i = 0 ; i < result.length; ++i){
System.err.print(result[i] + "|");
}
// 5개
System.out.println("개수 : " + result.length);
int i = 0;
for(;st.hasMoreTokens(); ++i){
System.out.print(st.nextToken() + "|");
}
// 3개
System.out.println("개수 : " + i);