java&spring

[Java] 문자열 자르기 비교(split vs StringTokenizer)

sungjine 2017. 5. 29. 19:59
반응형

문자열을 특정 문자를 통해서 잘라내고 싶을 때 split이나 StringTokenizer를 사용한다.

 

사용법을 먼저 보면 split은 String의 메서드이며 String 배열을 리턴한다.

String[] strArr = "aa,bb,cc".split(",");

그다음 StringTokenizer는 생성자를 통해서 객체를 만들면 된다.

StringTokenizer st = new StringTokenizer("aa,bb,cc", ",");

그리고 필요한 메서드를 사용하면 된다.

st.countTokens();   // 토큰의 개수 리턴 
st.hasMoreTokens(); // 다음 토큰이 존재하면 true 아니면 false를 리턴 
st.nextToken();     // 다음 토큰을 리턴 존재하지 않으면 NoSuchElementException throw한다.

 

이제 차이점을 알아보면 split은 문자열을 자를 때 정규식을 이용하고 StringTokenizer는 각각의 문자를 사용한다. 

 

아래와 같은 코드가 있을 때

String s = "a1b2c";
StringTokenizer st = new StringTokenizer(s, "[0-9]");
System.out.println(st.nextToken());
System.out.println("--------------------------");
String[] str = s.split("[0-9]");
System.out.println(str[0]);
System.out.println(str[1]);
System.out.println(str[2]);

결과는 아래와 같다.

a1b2c 
-------------------------- 
a 
b 
c

왜냐하면 split은 0부터 9 사이의 숫자를 통해서 문자열을 자른다면 StringTokenizer는 정규식을 이용하여 자를 수 없기 때문에 [, 0, -, 9, ] 이 문자들 각각으로 자르는데 문자열에 해당 문자가 없기 때문에 문자열이 잘리지 않은 것이다.

 

StringTokenizer를 통해서 split과 같은 결과를 출력하고 싶다면 아래와 같이 코딩하면 된다.

String s = "a1b2c";
StringTokenizer st = new StringTokenizer(s, "12");
System.out.println(st.nextToken());
System.out.println(st.nextToken());
System.out.println(st.nextToken());

또 다른 점은 중간에 빈 값이 있을 때 생긴다.

아래와 같은 코드가 있을 때

String s = "a,,c";
StringTokenizer st = new StringTokenizer(s, ",");
System.out.println(st.nextToken()); 
System.out.println(st.nextToken()); 
System.out.println("--------------------------"); 
String[] str = s.split(","); 
System.out.println(str[0]); 
System.out.println(str[1]);
System.out.println(str[2]);

StringTokenizer는 빈 값을 무시하고 split은 빈 값을 넣어 준다.

위 코드에 대한 결과 값이다.

a 
c 
-------------------------- 
a

c

위와 같은 결과를 보면 마지막에 빈 값이 올 경우에도 split은 ""를 보여줄 것으로 생각할 수 있지만 마지막에 오는 빈 값은 split도 무시한다.

String s = "a,c,";
String[] str = s.split(",");
System.out.println(str[0]);
System.out.println(str[1]);
System.out.println(str[2]); // ArrayIndexOutOfBoundsException

만약 마지막 값에 빈 문자열을 넣고 싶다면 아래와 같이 split메서드를 사용하면 된다.

String[] str = s.split(",", 3);

마지막으로 split은 정규식을 이용하여 문자열을 자르기 때문에 StringTokenizer보다 매우 느리다.

반응형