자바/유용한 클래스들

유용한 클래스(5) - StringTokenizer class

백_곰 2021. 12. 31. 10:00

1. java.util.StringTokenizer class

- 이 클래스는 긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰이라는 여러 개의 문자열로

잘라내는 데 사용된다.

 

- StringTokenizer는 구분자로 단 하나의 문자 밖에 사용하지 못하기 때문에 보다 복잡한 형태의 구분자로

문자열을 나누어야 할 때는 어쩔 수 없이 정규식 표현(Scanner 또는 split)를 사용해야 할 것이다.

 

 

- StringTokenizer 클래스의 생성자와 메서드는 아래와 같다.

(1) StringTokenizer(String str, String delim)

: str 문자열을 지정된 구분자 delim으로 나누는 StringTokenizer를 생성한다.

 

(2) StringTokenizer(String str, String delim, boolean returnDelims)

: returnDelims의 값을 true로 하면 구분자도 토큰으로 간주된다.

 

(3) int countTokens()

: 전체의 토큰의 수를 반환한다.

 

(4) boolean hasMoreTokens()

: 토큰이 남아있는지 알려준다.

 

(5) String nextToken()

: 다음 토큰을 반환한다.

 

 

 

 

1-1. StringTokenizer class를 이해하기 위한 예제(1)

: hasMoreTokens()와 nextToken()을 사용하는 예제이다.

 

 

 

 

 

1-2. StringTokenizer class를 이해하기 위한 예제(2)

: StringTokenizer의 생성자 boolean을 사용하는 예제이다.

 

( boolean 매개변수에게 인자값 true 주니, 구분자 또한 토큰이 되었다. )

 

 

 

 

1-3. StringTokenizer class를 이해하기 위한 예제(3)

: StringTokenizer를 2번 사용하는 예제이다.

 

 

 

 

 

1-4. StringTokenizer class를 이해하기 위한 예제(4)

: StringTokenizer를 이용하여 한글로 된 숫자를 아라비아 숫자로 바꾸는 예제이다.

 

public class Exercise001 {
	
	public static void main(String[] args) throws FileNotFoundException{
		String input = "삼천삼백삼십삼억삼천오백칠십오만오천오백오십오";
		System.out.println("현재: " + input);
		System.out.println(hangulToNum(input));
	}
	
	public static long hangulToNum(String input) {
		long result = 0;
		long tmpReuslt = 0;
		long n = 0;
		
		final String NUMBER = "영일이삼사오육칠팔구";
			final String UNIT = "십백천만억조";
			final long[] UNIT_NUM = {10,100,1000,10000,(long)1e8,(long)1e12};
		
		StringTokenizer st = new StringTokenizer(input, UNIT, true);
		
		while(st.hasMoreTokens()) {
			String token = st.nextToken();
			int check = NUMBER.indexOf(token);
			
			if(check == -1) {
				if("만억조".indexOf(token) == -1) {
					tmpReuslt += (n==0 ? 1 : n) * UNIT_NUM[UNIT.indexOf(token)];
				}else {
					tmpReuslt += n;
					result += (tmpReuslt==0 ? n : tmpReuslt+n) * UNIT_NUM[UNIT.indexOf(token)];
					tmpReuslt=0;
				}
				n=0;
			}else {
				n = check;
			}
		}
		result += tmpReuslt + n;
		
		return result;
	}
}

( 이러한 문제들은 종이에 쓰면서 순서도를 그린 후, 코드를 짠다면 매우 쉬울 것이다. )

 

 

 

 

1-5. StringTokenizer class를 이해하기 위한 예제(5)

: StringTokenizer과 split() 사용의 차이를 보여주는 예제이다.

 

( 출력 결과에서도 알 수 있듯이, split() 메서드는 빈 문자열까지 토큰으로 인식하는 반면 StringTokenizer는 빈 문자열을 인식하지 않는다. )

 

( 또한 split()은 배열을 반환하기 때문에 성능면에서는 StringTokenizer보다 떨어질 수밖에 없다. )