StringTokenizer VS split() 둘을 비교해보자

2023. 2. 7. 13:19Java/java

※ 지식이 많이 부족하여 이론적인 부분이 이해도 어렵고 설명도 주관적인게 많습니다. 틀린부분은 지적해주시면 감사하겠습니다.

 

백준 골드를 목표로 공부하면서 1152번 문제에서 막혀서 잠깐 구글링했습니다.

 

이정도 수준에서 못풀어서 검색하는 스스로가 안타까울뿐입니다.

 

원래 저는 split하기전에 문자열의 첫번째 글자와 마지막 글자가 공백인지 확인하고 이를 지우고 그 다음에 split으로 나눠주는 방법으로 문제를 해결하고자 했습니다.

 

하지만 자꾸만 에러가 발생하여 문제를 해결하지 못했고...결국엔 구글링의 힘을 빌어 해결했습니다.

 

그래서 얻은 해답이 바로 StringTokenizer 입니다.

 

StringTokenizer은 문자열을 토큰화 하는 클래스 입니다. 조금더 쉽게 말하면 문자열을 어떠한 기준에 따라 나누는 기능을 제공합니다.

 

split()에서는 String[]을 반환하지만 StringTokenizer는 나눈 문자들을 각각의 토큰으로 저장하게 됩니다.

 

StringTokenizer의 생성 예시는 아래와 같습니다

 

StringTokenizer st = new StringTokenizer(문자열)
StringTokenizer st = new StringTokenizer(문자열, 구분자)
StringTokenizer st = new StringTokenizer(문자열, 구분자, boolean)

 

StringTokenizer st = new StringTokenizer(문자열)

의 방법으로 문자열을 토큰화 시킬 경우에는 띄어쓰기를 기준으로 자동으로 문자열을 나누어 토큰화 합니다.

 

구분자를 사용할 경우에는 띄어쓰기가 아닌 사용자가 입력한 구분자를 기준으로 문자열을 나누어 토큰화합니다.

++ 이때에 구분자는 하나 이상이 될 수 있습니다. 구분자에 "-+" 를 입력한다면 -와 +를 기준으로 문자열을 나눕니다.

 

boolean은 구분자도 토큰에 포함할지를 결정합니다. true라면 구분자도 토큰에 포함시킵니다. 디폴트는 false입니다.

 

StringTokenizer에서 사용할 수 있는 메서드로는 hasMoreTokens(), nextToken(),countToken() 등이 있습니다.

 

hasMoreToken() 토큰이 더 남아있는지에 따라 true/false 반환
nextToken() 토큰(문자열)을 반환
nextToken(String delim) delim을 기준으로 토큰을 반환
countToken() 토큰의 갯수 반환

Q.그래서 split과 StringTokenizer의 차이는 뭐냐?

split은 String 클래스에서 사용할 수 있는 하나의 메서드, StringTokenizer는 클래스라는 차이점이 있습니다.

split은 빈 문자열도 인식해서 String[]을 반환하고, StringTokenizer는 빈 문자열은 토큰을 반환하지 않습니다.

 

Q.그래서 왜 split()이 아니라 StringTokenizer를 사용하냐?

일단, StringTokenizer가 더 빠릅니다. 이것만으로도 StringTokenizer를 사용하는 이유로는 충분하다 생각됩니다.

하지만 StringTokenizer는 특정 인덱스의 값을 가져오는 방법이 없고 반복문과 nextToken() 메서드를 사용하여 하나씩 확인해야한다는 번거로움이 있습니다.

많은 블로그를 보면서 이 둘의 차이를 비교해봤는데 일반적으로 StringTokenizer가 빠르지만 데이터가 많다면 큰 차이를 기대하기는 어렵다는 의견이 많았습니다. 

 

++plus

hasMoreTokens()와 hasMoreElements()가 있고 nextToken()과 nextElement()가 있어 각각의 차이가 무엇인지 궁금하여 찾아봤습니다.

결국 얻은 답은 같다는 건데 이름에서 좀더 직관적인 hasMoreTokens()와 nextToken()을 사용하는것이 가독성이 좋은 코드가 될것같다 생각합니다.