[Java] StringTokenizer 문자열 분리하기 (split과 차이는 뭘까?)
by coco3oStringTokenizer 클래스란?
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를 이용할 경우 전체 토큰을 보고싶다면 반복문을 이용해 하나하나 뽑을 수 밖에 없습니다.
'🌈Programming > Java' 카테고리의 다른 글
[Java] String 클래스의 contains() 메소드 (0) | 2021.10.27 |
---|---|
[Java] toString() 과 String.valueOf() 비교 및 차이점 (0) | 2021.09.02 |
[Java] 자바 퍼시스턴스 프레임워크 ( Java Persistence Framework ) (0) | 2021.07.07 |
[Java] IO와 NIO의 차이점? / IO와 NIO의 선택 (0) | 2021.05.18 |
[Java] JavaFX란? / AWT란? / Swing이란? (0) | 2021.05.15 |
블로그의 정보
슬기로운 개발생활
coco3o