슬기로운 개발생활

[Java] StringTokenizer 문자열 분리하기 (split과 차이는 뭘까?)

by coco3o
반응형

StringTokenizer 클래스란?

StringTokenizer 클래스는 문자열을 구분자를 이용하여 분리할 때 사용할 수 있습니다.

만일 BufferedReader 클래스의 메서드로 입력을 읽어들인다면 라인 단위로 읽어들일 수 밖에 없습니다.

꼭 BufferedReader 클래스만이 아니더라도, 스페이스 기준으로 혹은 컴마로 혹은 공백을 기준으로 문자열들을 분리한다던가, 특정 문자에 따라 문자열을 나누고 싶을 때 StringTokenizer를 사용합니다.

간단하게
String : 문자열을
Tokenizer : 토큰화한다.
이렇게 해석할 수 있습니다. 즉, 토큰은 분리된 문자열 조각으로, StringTokenizer 클래스는 하나의 문자열을 여러 개의 토큰으로 분리하는 클래스인거죠.


StringTokenizer 생성자

StringTokenizer를 생성하는 방식은 3가지가 있습니다.

//1. 띄어쓰기 기준으로 문자열을 분리
StringTokenizer st = new StringTokenizer(문자열);

//2. 구분자를 기준으로 문자열을 분리
StringTokenizer st = new StringTokenizer(문자열, 구분자);

/* 3. 구분자를 기준으로 문자열을 분리할 때 구분자도 토큰으로 넣는다. (true)
 * 구분자를 분리된 문자열 토큰에 포함 시키지 않는다. (false)
 * (디폴트 : false)
 */
 StringTokenizer st = new StringTokenizer(문자열 , 구분자 , true/false);

1. 가장 간단하게 문자열을 이용해 StringTokenizer 객체를 생성합니다.
이럴 경우 문자열은 띄어쓰기 기준으로 나눠지게 됩니다.

2. 어떤 걸 기준으로 나눌지 구분자를 명시해 StringTokenizer 객체를 생성합니다.

3. 생성자 마지막 인자에 true/flase의 boolean 타입의 값을 넣어주는데,
true라면 구분자도 토큰에 포함되고, false라면 구분자는 구분하는데만 쓰고 토큰에 포함되지 않습니다.
디폴트는 false 입니다.

문자열을 띄어쓰기 기준으로 분리하기

import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args)  {

        String str = "안녕하세요 슬기로운개발생활 tistory 입니다.";
        StringTokenizer st = new StringTokenizer(str);
        
        while (st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }
    }
}
안녕하세요
슬기로운개발생활
tistory
입니다.

Process finished with exit code 0

문자열 "안녕하세요 슬기로운개발생활 tistory 입니다."을 토큰화 한 후,
분리된 문자열(토큰)을 nextToken() 메서드로 확인할 수 있습니다.

문자열을 구분자 기준으로 분리하기

import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args)  {

        String str = "오늘!날씨는!맑음";
        StringTokenizer st = new StringTokenizer(str, "!" );

        while (st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }

    }
}
오늘
날씨는
맑음

Process finished with exit code 0
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args)  {

        String str = "오늘!날씨는!맑음";
        StringTokenizer st = new StringTokenizer(str, "!", true);
        
        while (st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }

    }
}
오늘
!
날씨는
!
맑음

Process finished with exit code 0

StringTokenizer 생성자 마지막 인자에 true 줘서 구분자로 지정된 느낌표(!) 도 토큰에 들어간 것을 확인할 수 있습니다.

구분자가 하나가 아닌 여러 문자라면?

"블로그 >슬기로운 개발생활 :dev-coco.tistory.com" 의 문자열이 있을 때,
' : ' 로 구분한다면
첫 번째 토큰 "블로그>슬기로운 개발생활"
두 번째 토큰"dev-coco.tistory.com"
총 두개의 토큰이 생성될겁니다.

만약,
1. 블로그
2. 슬기로운 개발생활
3. dev-coco.tistory.com
이렇게 세 개의 토큰으로 구분하고 싶다면, 구분자는 ' > ' 와 ' : ' 두개여야 할겁니다.

StringTokenizer는 구분자 인자에 아래와 같이 여러 개의 구분자를 이용할 수 있게 문자열을 받습니다.

import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args)  {

        String str = "블로그 >슬기로운 개발생활 :dev-coco.tistory.com";
        StringTokenizer st = new StringTokenizer(str, ">:" );

        while (st.hasMoreTokens()) {
            System.out.println(st.nextToken());
        }

    }
}
블로그 
슬기로운 개발생활 
dev-coco.tistory.com

Process finished with exit code 0

구분자는 하나의 문자로만 구성될 필요는 없고, 여러 개의 문자를 구분자로 토큰을 만들 수도 있습니다.


StringTokenizer 메서드

리턴값 메서드명 역할
boolean hasMoreTokens() 남아있는 토큰이 있으면 true를 리턴, 더 이상 토큰이 없으면 false 리턴
String nextToken() 객체에서 다음 토큰을 반환
String nextToken(String delim) delim 기준으로 다음 토큰을 반환
boolean hasMoreElements() hasMoreTokens와 동일한데 엘리먼트보다 토큰으로 된 메서드를 주로 사용
Object nextElement() nextToken 메서드와 동일하지만 문자열이 아닌 객체를 리턴
int countTokens() 총 토큰의 개수를 리턴

자주 사용하는 메서드는 hasMoreTokens, countTokens, nextToken 입니다.


StringTokenizer와 split의 차이

둘 다 문자열 파싱하는데 사용할 수 있습니다.
StringTokenizer는 java.util에 포함되어 있는 클래스, split는 String 클래스에 속해있는 메소드입니다.

StringTokenizer는 문자 또는 문자열로 문자열을 구분한다면, split는 정규표현식으로 구분합니다.

StringTokenizer는 빈 문자열을 토큰으로 인식하지 않지만 split는 빈 문자열을 토큰으로 인식하는 차이가 있습니다.

StringTokenizer는 결과값이 문자열이라면 split는 결과 값이 문자열 배열입니다.
따라서 StringTokenizer를 이용할 경우 전체 토큰을 보고싶다면 반복문을 이용해 하나하나 뽑을 수 밖에 없습니다.


참고

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기