[Java] 문자열 자르기 비교(split vs StringTokenizer)
문자열을 특정 문자를 통해서 잘라내고 싶을 때 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보다 매우 느리다.