관리 메뉴

나만을 위한 블로그

[JAVA] StringTokenizer란? 본문

JAVA

[JAVA] StringTokenizer란?

참깨빵위에참깨빵 2022. 5. 15. 17:56
728x90
반응형

자바에서 문자열을 쪼갤 때 자주 사용하는 건 split()이다. 가끔 subString()도 사용하곤 한다.

이것 말고도 다른 클래스가 코테에서 문자열 쪼개기에 자주 사용된다. 바로 StringTokenizer다.

 

오라클 공식 홈페이지에선 StringTokenizer를 아래와 같이 설명하고 있다.

 

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

 

StringTokenizer (Java Platform SE 7 )

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

이 클래스를 쓰면 문자열을 토큰으로 나눌 수 있다. 토큰화 방법은 StreamTokenizer 클래스에서 사용하는 메서드보다 간단하다. StringTokenizer 메서드는 식별자, 숫자, 인용 문자열을 구분하지 않으며 주석을 인식하고 건너뛰지 않는다. 구분 기호 집합(토큰을 구분하는 문자)은 생성 시 또는 토큰별로 지정할 수 있다.
StringTokenizer의 인스턴스는 T/F 값을 갖는 returnDelims 플래그로 생성됐는지 여부에 따라 둘 중 하나로 작동한다.

- 플래그가 false면 구분 기호가 토큰을 구분하는 역할을 한다. 토큰은 구분 기호가 아닌 연속 문자의 최대 시퀀스다
- 플래그가 true면 구분 기호 문자 자체가 토큰으로 간주된다. 따라서 토큰은 하나의 구분 기호 문자거나 구분 기호가 아닌 연속 문자의 최대 시퀀스다

StringTokenizer 객체는 토큰화할 문자열 안의 현재 위치를 내부적으로 유지 관리한다. 일부 작업은 처리된 문자를 지나 현재 위치로 이동한다. StringTokenizer 객체를 만드는데 사용된 문자열의 하위 문자열을 써서 토큰이 리턴된다. 아래는 Tokenizer 사용의 한 예시다
public static void main(String[] args) {
    StringTokenizer st = new StringTokenizer("테스트 문자열 입니다");
    while(st.hasMoreTokens()) {
        System.out.println("st.nextToken() : " + st.nextToken());
    }
}

// >> st.nextToken() : 테스트
// >> st.nextToken() : 문자열
// >> st.nextToken() : 입니다
StringTokenizer는 새 코드에서 사용이 권장되지 않지만 호환성을 위해 유지되는 레거시 클래스다. 이 기능을 원하면 String 또는 java.util.regex 패키지의 split()을 대신 쓰는 것이 좋다

 

문자열을 뭘로 쪼갤지 개발자가 따로 설정을 하지 않으면 위 코드의 결과물처럼 공백을 기준으로 쪼개지는 걸 볼 수 있다.

다른 글들은 어떻게 설명하는지 더 찾아봤다.

 

https://www.javatpoint.com/string-tokenizer-in-java

 

StringTokenizer in Java - javatpoint

Java StringTokenizer class in java breaks a string into tokens. There are nextToken() method, hasMoreTokens() method, countTokens() method to deal with tokens in java.

www.javatpoint.com

java.util.StringTokenizer 클래스를 쓰면 문자열을 토큰으로 나눌 수 있다. String을 쪼개는 간단한 방법이다. 자바의 레거시 클래스다. StringTokenizer 클래스와 같이 숫자, 인용 문자열, 식별자 등을 구별하는 기능은 제공하지 않는다. StringTokenizer 클래스에서 구분자는 생성 시 제공되거나 토큰에 하나씩 제공될 수 있다.

StringTokenizer 클래스는 3개의 생성자를 갖고 있다.

- StringTokenizer(String str) : 지정된 문자열로 StringTokenizer를 생성한다
- StringTokenizer(String str, String delim) : 지정된 문자열, 구분 기호로 StringTokenizer를 생성한다
- StringTokenizer(String str, String delim, boolean returnValue) : 지정된 문자열, 구분 기호, returnValue를 써서 StringTokenizer를 만든다. 리턴값이 true면 구분 문자는 토큰으로 간주된다. false면 구분 기호는 토큰을 구분하는 역할을 한다

StringTokenizer 클래스의 유용한 6가지 메서드는 아래와 같다.

- boolean hasMoreTokens() : 사용 가능한 토큰이 더 있는지 확인한다
- String nextToken() : StringTokenizer 객체에서 다음 토큰을 리턴한다
- String nextToken(String delim) : 구분 기호를 기반으로 다음 토큰을 리턴한다
- Object nextElement() : nextToken()과 동일하지만 리턴 타입은 Object다
- int countTokens() : 총 토큰 수를 반환한다

 

공식 문서에서 제공하는 예제를 보면 사용법도 그렇게 어렵지 않고 메서드도 딱히 어렵지 않다.

그러나 공식 문서에서도 StringTokenizer 클래스 대신 split()을 쓰라고 권장하는데, 이것이 코딩 테스트에서 자주 사용되는 이유는 뭘까?

아래는 어떤 백준 문제 풀이를 올린 한 블로거의 글이다.

 

https://a1010100z.tistory.com/87

 

[백준 알고리즘 - 1806] 부분합 + StringTokenizer 정리 - java

최근에 문제를 풀다가 아주 놀라운 경험을 했는데 바로 입력 방식만 바꿈으로써 실행 시간이 400ms나 줄었다는 것이다! Scanner를 통해 입력을 처리한 코드 import java.util.Scanner; class Main{ public static..

a1010100z.tistory.com

...(중략) 입력 방식만 바꿈으로써 실행 시간이 400ms나 줄었다

- Scanner를 써서 입력을 처리한 코드 실행 결과 : 672ms
- BufferedReader, StringTokenizer를 써서 입력을 처리한 코드 실행 결과 : 232ms

 

그냥 깡 스캐너만 썼을 때보다 BufferedReader와 StringTokenizer를 썼더니 실행 시간이 많이 줄어든 걸 볼 수 있다. 원래 BufferedReader 만으로도 스캐너보다 더 우위의 성능을 보여주는데 컴파일 시간 결과를 비교해보니 얼마나 성능 차이가 나는지 보인다.

그래서 실제 업무에선 split()이나 써봤자 subString() 정도로 해결되는 문자열 쪼개기지만 코드 컴파일 시간 등 여러 요소가 고려되는 코테 특성 상 StringTokenizer 클래스가 더 애용되는 걸로 생각된다.

반응형
Comments