본문 바로가기

별걸다하는 IT/프로그래밍언어

[JAVA 자바] StringTokenizer 클래스로 문자열 분리하기! split 비교.

안녕하세요 양햄찌 블로그 주인장입니다. 

저번시간에는 split 함수를 이용해서 문자열을 나누는 방식을 알아봤는데요.

 

혹시 해당 포스팅이 궁금하신 분은 아래 링크를 참고해주세요

▼ 자바 SPLIT 메서드로 문자열 분리하기: jhnyang.tistory.com/336

 

[JAVA 자바] String클래스의 split 메서드로 문자열 분리하는 법. 문자열 파싱. StringTokenizer, substring와

안녕하세요 양햄찌 블로그 입니다. 저번 시간에는 String클래스의 substring에 대해 알아보았는데요, 요 아이는 인덱스를 기준으로 문자열을 추출하는 메서드였죠 ㅎㅎ 저번 포스팅이 궁금하신 분

jhnyang.tistory.com

오늘은 저번 포스팅에서 언급했듯이 StringTokenizer에 대해 포스팅을 해보려 합니다.

 

StringTokenizer 클래스란?

BufferedReader 클래스의 메서드로 입력을 읽어들이면, 라인 단위로 읽어들일 수밖에 없어요.

거기서 머 스페이스 기준으로 문자열을 분리한다던가 필요할때가 많겠죠?

 

BufferedReader 클래스가 아니더라도, 컴마로 구분되는 문자열들을 분리한다던가, 

특정 문자에 따라 문자열을 나누고 싶을 때에 StringTokenizer를 이용하실 수 있습니다. 

 

String : 문자열을

Tokenizer : 토큰화한다.

이렇게 해석할 수 있는데요, 즉 토큰은 분리된 문자열 조각으로, 스트링토크나이저 클래스는 하나의 문자열을 여러 개의 토큰으로 분리하는 클래스인거죠.

 

StringTokenizer 라이브러리 임포트

import java.util.StringTokenizer;

'java.util'을 임포트해줘도 되고 'java.util.StringTokenizer' 임포트해줘도 되고!

이클립스라면 'ctrl+shift+o' 단축키를 눌러서 자동으로 임포트해줍시다.

 

StringTokenizer 생성자

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

첫번째! 가장 간단하게 문자열을 이용해서 StringTokenizer 객체를 만드는 법이 있습니다.

이럴 경우 문자열을 무엇을 기준으로 나누냐! 띄어쓰기 기준으로 나눠지게 됩니다.

 

두번째의 경우, 어떤 걸 기준으로 나눌지 구분자를 명시해 StringTokenizer 객체를 생성할 수도 있습니다.

세번째, 생성자 마지막 인자에 true/false의 boolean 타입의 값을 넣을 수 있는대,

true면 구분자도 토큰으로 취급하고 false면 구분자는 구분하는대만 이용되고 토큰에 포함되지 않습니다.

 

[StringTokenizer를 이용해 문자열을 띄어쓰기 기준으로 분리해보자]

import java.util.StringTokenizer;
public class Main {
	public static void main(String[] args)  {
		String str = "양햄찌 블로그 jhnyang tistory";
		StringTokenizer st = new StringTokenizer(str);
		
		System.out.println(st.nextToken());
		System.out.println(st.nextToken());
		System.out.println(st.nextToken());
		System.out.println(st.nextToken());
	}
}

문자열 "양햄찌 블로그 jhnyang tistory"을 StringTokenizer로 나눠봤어요.

분리된 문자열(토큰)을 확인하고 싶으실 경우 nextToken()이라는 함수로 가져와 확인할 수 있습니다.

문자열 토큰 4개가 잘 출력되었어요

문자열 토큰 4개가 잘 출력된 것을 확인하실 수 있습니다.

 

[구분자도 토큰으로!]

import java.util.StringTokenizer;
public class Main {
	public static void main(String[] args)  {
		String str = "문!자!열";
		StringTokenizer st = new StringTokenizer(str, "!", true);
		
		int i = 1;
		while(st.hasMoreTokens()) {  //다음 토큰이 있다면
			System.out.println((i++)+"번째 토큰: "+st.nextToken());
		}	
	}
}

토크나이저 객체를 생성할 때 세 번째 인자에 true를 주면 구분자로 지정된 문자 또한, 토큰으로 넣어줍니다.

여기서 구분자는 느낌표(!)였는대요, 토큰이 느낌표까지 포함해서 총 5개로 생성되었습니다.

StringTokenizer 메서드

앞에서 nextToken() 이용해 토큰값을 가져올 수 있다는 건 대충 알았어요.

이 외에 이 클래스에서 지원하는 메서드들은 뭐가 있을까요?

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

자주 사용하는 메서드는 hasMoreTokens, countTokens 그리고 nextToken 정도 되겠습니다.

 

[hasMoreTokens랑 nextToken 메서드 이용해서 분리된 문자열 모두 출력하기]

import java.util.StringTokenizer;
public class Main {
	public static void main(String[] args)  {
		String str = "양햄찌블로그.jhnyang.tistory.com";
		StringTokenizer st = new StringTokenizer(str, ".");
		
		while(st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}	
	}
}

hasMoreToken 값이 true이면 토큰 값이 있다는 거니까 다음 토큰을 출력해서 보여주도록 간단하게 작성해봤습니다.

토큰 4개가 잘 출력되네요

 

구분자를 하나의 문자가 아닌 여러 문자로 구분하기

"IT 블로그 추천 - 양햄찌 블로그 : jhnyang.tistory.com" 이런식의 문자열이 있다고 합시다.

그런데 만약 문자 '.'으로 구분하면 ~

첫 번째 토큰 "IT 블로그 추천 - 양햄찌 블로그" 

두 번째 토큰 "jhnyang.tistroy.com"

총 두개의 토큰이 생성되겠죠?

 

그런데!!

1. IT 볼로그 추천

2. 양햄찌 블로그

3. jhnyang.tistory.com 

이렇게 세 개의 토큰으로 구분하고 싶다고 합시다.

그럼 구분자는 대시 (-)와 콜럼(:) 두 개여야 할 거예요! 

 

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

import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args)  {
		String str = "IT 블로그 추천 -양햄찌블로그:jhnyang.tistory.com";
		StringTokenizer st = new StringTokenizer(str, "-:");
		
		while(st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}	
	}
}

대시(-)와 콜럼(:) 두 개의 문자를 구분자로 사용해서 분리했을 경우

짠~~!

즉! 구분자는 하나의 문자로 구성될 필요는 없다. 하나 문자가 아닌, 여러개의 문자를 구분자로 토큰을 만들 수 있다.

StringTokenizer와 Split 차이?

둘 다 모두 문자열 파싱하는데 사용할 수 있죠~

 

■ StringTokenizer는 java.util에 포함되어 있는 클래스, split는 String클래스에 속해있는 메소드이다.

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

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

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

 배열에 담아 반환하는 스플리트는 데이터를 바로바로 잘라서 반환해주는 스트링토크나이져보다 성능이 약간 뒤쳐지겠죠? 그러나 데이터양이 많은 경우 거기서 거기기 때문에 크게 신경쓸 필요는 없습니다.

 

오늘은 여기까지입니다.

도움이 되셨다면 공감은 어떠신가요? 정보공유에 큰 동기부여가 됩니다. :)