일반적으로 문자열을 자를 때 StringTokenizer와 String클래스의 split메소드를 사용한다.
알고있기로는 StringTokenizer가 미세하게 좀 더 빠르다고 알고있는데, 왜 그런지, 또 토큰이란게 정확하게 무엇인지 궁금해져서 각각의 내부 구조를 찾아보기로 하였다.
String클래스의 split메서드의 동작은 다음과 같다.
StringTokenizer객체 생성 시, 파라미터 string 값을 멤버변수로 가지고, string의 index를 가르킬 포인터, string의 길이 등을 변수로 가진다.
nextToken메서드의 동작은 간단하게 다음과 같다.
1. 현재 포인터가 길이를 넘지 않는지 확인.
2. scanToken을 호출하여 다음 구분자가 있는 index 찾기.
2-1. 포인터로 string을 charAt()해서 char로 들고오기
2-2. 해당char가 구분자에 있는지 indexOf()로 확인.
3. substring으로 해당 영역을 잘라서 반환.
StringTokenizer의 scanToken()은 string index 하나하나마다 구분자 하나하나와 같은것이 있는지 확인하기 때문에 구분자의 길이가 길어지면 시간이 배로 소요된다.
구분자를 지정해주지 않고 기본으로 생성하여도 " \t\n\r\f" 5가지를 구분자로 설정한다.
코드를 읽어보며 재미있었던 점은 StringTokenizer 클래스는 레거시 라는 점이다!
* {@code StringTokenizer} is a legacy class that is retained for
* compatibility reasons although its use is discouraged in new code. It is
* recommended that anyone seeking this functionality use the {@code split}
* method of {@code String} or the java.util.regex package instead.
해석해보면 StringTokenizer는 하위 호완성을 위해 유지되는 레거시 클래스이니 String의 split을 사용하라고 권장한다.
String, StringTokenizer 두 클래스를 열심히 쳐다보면서 느낀점은
@param
,@return
이런 태그들에 설명이 있어 좋았다. 나도 코드 적으면서 주석을 잘 써야겠다는걸 다시 되새기는 시간이 되었다.