[Java] StringTokenizer

Robo·2022년 2월 4일
2

Java

목록 보기
1/2

시작하기 전에

나 : 알고리즘 문제 푸는 사람이 문제를 안보고 클래스 뜯어보고 있다니... 희한하구만.
나 : 어이. 뉴게이트. 너 대체 뭘 원하는거냐!
뉴게이트 : StringTokenizer...
나 : 뭐?

알고리즘 풀다가 StringTokenizer 원리가 궁금해서 클래스를 뜯어보았다.
Java 11 기준 StringTokenizer이다.

StringTokenizer

StringTokenizer는 Java에서 String 자료형을 구분기호대로 나누어주는 클래스이다.

StringTokenizer의 생성자는 총 3개로 이루어져있다.

1. StringTokenizer(String str): 개행, 공백, 탭, 캐리지 리턴 및 양식 피드와 같은 기본 구분 기호로 매개변수 str을 나눈다.
2. StringTokenizer(String str, String delim): delim은 주어진 문자열을 토큰화하는 데 사용되는 구분 기호 집합이다.
3. StringTokenizer(String str, String delim, boolean flag): 2번과 같고 추가된 매개변수인 flag만 특이한데 flag에 따른 값은 다음과 같다.

  • flag = false
    flag가 false인 경우 구분기호는 토큰화되지 않는다.
    	String str = "어이 뉴게이트 해적이 재보에 관심이 없다니";
    	StringTokenizer st = new StringTokenizer(str, " ", false);
    Token은 "어이", "뉴게이트", "해적이", "재보에", "관심이", "없다니" 이다.


  • flag = true
    flag가 true인 경우 구분기호 또한 토큰화 된다.
    	String str = "너 대체 뭘 원하는거냐";
    	StringTokenizer st = new StringTokenizer(str, " ", true);
    Token은 "너", " ", "대체", " ", "뭘", " ", "원하는거냐"이다.
    구분기호인 공백까지 토큰화된걸 볼 수 있다.

그래서 클래스는?

1번 생성자

2번 생성자

1번, 2번 생성자 모두 3번 생성자를 this키워드로 불러주는 걸 볼 수 있다. StringTokenizer 공식문서에서 써있듯이 1번 생성자처럼 delim을 지정하지 않으면 the space character, the tab character, the newline character, the carriage-return character, and the form-feed character를 모두 구분해주는 걸 볼 수 있다.

그럼 핵심은 3번 생성자라는 이야기인데,

3번 생성자

대충 이렇게 되어있는데 매개변수인 str, delim, returnDelims 이외 저 내부 멤버변수나 setMaxDelimCodePoint()같은 멤버메소드들은 우리가 다 해석할 필요가 없다.

우리는 보통 Token을 쓸 때 nextToken으로 다음 토큰들에 접근한다. nextToken 메소드만 보면 원리를 파악할 수 있을 것이다.

str.substring 라는 함수를 봤다면 모든 것을 다 본 것이다.
StringTokenizer는 str.substring 윗 줄의 scanToken이라는 함수를 사용해 다음 구분기호까지의 위치를 파악하고 substring 함수를 사용하는 것이다.

마무리하며

StringTokenizer를 쓰면서 split은 왜 안쓰냐고 물어볼 수 있다. split은 StringTokenizer보다 느리다. Scanner를 쓴다면 next() 메소드로 모두 해결되겠지만 그것은 BufferedReader + split보다 더 느리다. StringTokenizer를 몰랐다면 한번 써보기를 추천한다!

profile
호호선생

2개의 댓글

comment-user-thumbnail
2022년 2월 8일

원피스 덕후가 안 들어올 수 없는 썸네일이었습니다. 뜻밖의 자바 공부하고 갑니다.ㅎㅎ

1개의 답글