JAVA

[Java] StringTokenizer hasMoreTokens() nextToken()

로춘남 2022. 1. 24. 15:43
728x90


백준 알고리즘을 하다가 Scanner 대신 Buffereader를 많이 사용하는걸 연습했었고, 그 과정에서 많이 보게된 StringTokenizer hasMoreTokens() 그리고 nextToken() 이 친구들이 무엇인지 한 번 살펴보고자 한다.

 

일단 여기서 자꾸 언급되는 토큰(Token) 이란?

※ 컴파일러는 번역할 경우 먼저 워드해석이라 불리는 기호열로서 입력된 소스 프로그램에서 구문 규칙에 기초하여 이름표, 연산자, 딜리미터 등의 식별을 하고, 내부데이터의 열로 변환. 이 워드해석을 하여 식별되는 단위를 실러블(syllable)이라 하며, 그 내부데이터 표현을 토큰이라함(출처: 네이버 사전)

 

StringTokenizer

- 사용자가 지정하는 구분자를 경계로하여 문자열을 나눠주는 Class

- 사용자가 구분자 지정을 생략하면 공백이나 탭이 기본 구분자로 사용

- StringTokenizer 클래스 생성자의 3번째 인수로 구분자를 토큰에 포함할지의 여부를 지정 할 수 있음.

- 3번째 인수 생략시(false) 구분자는 토큰에 포함되지 않지만, 3번재 인수에 true를 입력하면 구분자도 토큰으로 취급

- StringTokenizer 클래스 생성자의 2번째 인수로 구분자를 여러개 지정 할 수 있음.

import java.util.StringTokenizer;

public class Test {
	public static void main(String[] args) {
    	String str1 = "서울 로마 뉴욕";
	}
}

문자열 변수 str1를 선언하고  tab과 스페이스를 포함하는 문자열 "서울 로마 뉴욕"을 초기값으로 설정

import java.util.StringTokenizer;

public class Test {
	public static void main(String[] args) {
    	String str1 = "서울 로마 뉴욕";
        StringTokenizer st1 = new StringTokenizer(str1);
	}
}

StringTokenizer 클래스의 새로운 객체 st1을 생성하고, 문자열 변수 str1을 인수로 입력한다. 객체 st1에는 별도로 구분자 지정을 하지 않았기때문에 tab과 스페이스가 기본 구분자로 사용되었다.

 

문자열 구분 str1은 변수에 저장된 문자열이 시작인 서울에서 끝인 뉴욕까지 계속 실행되어야한다. while문을 사용하여 문자열의 끝까지 구분을 해보자.

 

hasMoreToken()

- StringTokenizer 클래스 객체에서 다음에 읽어 올 token이 있으면 true, 없으면 false를 return해주는 녀석이다.

 

nextToken()

- StringTokenizer 클래스 객체에서 다음 토큰을 읽어온다.

import java.util.StringTokenizer;

public class Test {
	public static void main(String[] args) {
    	String str1 = "서울 로마 뉴욕";
        StringTokenizer st1 = new StringTokenizer(str1);
        while(st1.hasMoreTokens()) {
        	System.out.println(st1.nextToken());
		}
    		System.out.println("======");
	}
}

객체 st1의 인수, 변수 str1 값 내에서 읽어 올 token이 없을때까지 while문은 반복하게 된다. 다음에 읽어올 token이 있으면 true, 없으면 false를 return 하는 hasMoreTokens() 메소드를 사용하였다. 어찌보면 이 것은 while(true) 의미일지도..?!

while를 반복하는 동안 실행될 nextToken() 메소드는 조건을 만족할때까지 계속적으로 다음 토큰을 읽어들인다.

 

그렇다면 결과물은

서울

로마

뉴욕

 

이렇게 잘라서 출력이 될 것이다.

 

2개 이상 구분자로도 문자열을 나눌 수 있다.

import java.util.StringTokenizer;

public class test {
    public static void main(String[] args) {
        String str3 = "서울.로마,뉴욕.파리,도쿄.베를린";
        StringTokenizer st3 = new StringTokenizer(str3, ",.");

        while(st3.hasMoreTokens()){
            System.out.println(st3.nextToken());
        }
        System.out.println("======");
    }
}

출력값 : 

서울

로마

뉴욕

파리

도쿄

베를린

728x90

'JAVA' 카테고리의 다른 글

[Java] Stream & Lambda 람다 스트림  (0) 2022.01.28
[Java] HashMap  (0) 2022.01.26
[Java] 불필요한 객체 생성를 피하기 이펙티브 자바 new String  (0) 2022.01.21
[JPA] JPA 기본 객체 매핑  (0) 2022.01.20
[JPA] JPA 기본 시작  (0) 2021.12.21