본문 바로가기
Dev/Java

06.StringTokenizer

by YoonYeoJin 2023. 7. 27.

Math클래스나 String에 관련된 함수들을 여태까지 알아봤었는데

마지막으로 StringTokenizer에 대해서 알아보려고 한다.

오늘은 split()과 StringTokenizer에 대해서 알아보자

 

0. 사용이유

간단하게 설명해서 문자열을 분리하기 위함이다.

길게 나열된 문자열을 어떤 기준이 되는 구분자에 의해 나누고 싶을 때

위에서 언급한 split함수나 StringTokenizer를 사용하게 된다.

1. split(구분자)

split()함수는 구분자로 선언된 문자열을 구분자를 기준으로 나눠서 String[]배열에 담아주는 역할을 한다.

내가 쓰고도 무슨말인지 모르겠지만 간단하게 코드로 알아보도록 하자.

그림과 같이 Java,Oracle,JDBC,JavaScript,JQuery,Mybatis,Ajax라는 문자열을 선언했고 저 문자열을 ,로 구분을 지은 것을 확인할 수 있다.

여기서 sArr배열에 담기 위해서 split()함수를 사용하였다.

그리고 그 배열을 확인하기 위해 향상된 for문인 foreach문을 사용하였다.

(foreach문에 대해서는 다음 게시글에서 간단하게 정리해야지)

그렇게 출력된 결과를 확인해보면

그림과 같이 분리가 된 것을 사용할 수 있다.

이렇게 split을 사용해서 문자열을 분리를 할 수 있는 첫번째 방법을 알아보았다.

 

2. StringTokenizer

문자열을 나누는 두번째 방법인 StringTokenizer

교육을 받을 당시에도 StringTokenizer 클래스에서 제공하는 메소드와 그 사용방법이 어려워서 무슨말이지 하는 기억이 있긴하지만, 다시 한번 정리해보도록 하겠다.

StringTokenizer 선언 방법

split과 달리 StringTokenizer를 사용하면 배열을 선언할 필요가 없이 StringTokenizer(분리할 문자열, 구분자);를 이용하면 된다.

그렇다면 StringTokenizer를 사용해서 분리한 문자열을 어떻게 출력할 수 있으며 사용할 수 있는 메소드는 무엇이 있을까?

1) countTokens()

countTokens()는 분리된 문자열의 개수를 반환시켜주는 메소드이다. 간단하게 코드로 살펴보면

2) nextToken()

nextToken()은 첫 토큰값을 가져오는 메소드이다. 이 역시 코드를 살펴보면

nextToken()은 분리된 문자열을 하나씩 뽑아내는 메소드이다. 코드로 7개의 nextToken()을 실행시키면 사진과 같이 하나씩 뽑아낸 것을 볼 수 있다. 

근데 여기서 nextToken()을 한 번 더 쓰게 된다면 어떻게 될까

그림과 같이 NoSuchElementException 예외(더 이상 가져올 요소가 없음)가 발생하는 것을 확인할 수 있다.

 7개의 nextToken() 사용 후 countToken()을 사용하면 StringTokenizer 안의 토큰이 0개가 된 것을 확인할 수 있다.

즉 Token은 1회성이며, 다 뽑으면 끝난다는 점을 확인할 수 있다.

 

3) hasMoreTokens()

hasMoreTokens를 알아보기 전에 반복문을 사용해서 출력하는 방법에 대해서 잘못된 방법을 먼저 알아보려고 한다.

StringTokenizer를 반복문을 사용해 출력하는 잘못된 방법

위와 같이 선언한 문자열의 개수는 7개지만 출력을 하면 4개만 출력되는 것을 확인할 수 있다.

이에 대한 이유는 nextToken이 실행될 때 countTokens의 숫자가 하나씩 줄어들기 때문에 조건문에 있는 countTokens()가 7을 반환하지 않게되는 것이다.

 

그렇다면 해결방법은 무엇이 있을까

첫번째 방법으로는

count라는 변수에 countTokens()을 실행해 7이라는 숫자를 고정적으로 저장해놓는 것이다.

그래서 for문에 조건식 안에 countTokens()가 아닌 count를 명시해서 nextToken()이 실행되도 조건식에 있는 숫자가 변동이 생기지 않게 하는 방법이다.

가장 직관적이고 간단한 방법이라고 할 수 있지만, 불필요한 변수를 선언한다는 단점이 있다.

 

그래서 두번째 방법인 hasMoreTokens()을 사용하는 방법이다.

hasMoreTokens는 간단하게 설명해서 토큰이 남아있을 때까지라는 뜻이다.

그래서 while문 조건식 안에 해당 메소드를 사용하면 수행조건이 토큰이 남아있을 때까지만 돌아가며

nextToken()의 영향을 받지 않게 되는 것이다.

첫번째 해결방법과 비교를 하면 코드도 훨씬 간단하고 불필요한 변수 선언을 할 필요가 없다는 장점이 있다.

 

 

오늘은 이렇게 split()과 StringTokenizer에 대해서 알아봤다.

다음에는 Wrapper 클래스와 Date 클래스에 대해서 정리해보려고 한다.