StringTokenizer 정리

이윤화·2025년 9월 30일

Java

목록 보기
5/10
post-thumbnail

📌 StringTokenizer가 하는 일

한 문장 요약: 하나의 긴 문자열을 공백 기준으로 잘라서, 필요할 때마다 하나씩 꺼내 쓸 수 있게 해주는 도구

원본: "20 10 35 30 7"
       ↓ (공백 기준 분리)
토큰: ["20", "10", "35", "30", "7"]

🎯 왜 사용할까?

Scanner vs split() vs StringTokenizer

// Scanner (가장 느림)
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();

// split() (배열 생성 - 메모리 사용)
String[] arr = line.split(" ");
int a = Integer.parseInt(arr[0]);

// StringTokenizer (가장 빠름)
StringTokenizer st = new StringTokenizer(line);
int a = Integer.parseInt(st.nextToken());

결론: 대용량 입력에서는 StringTokenizer가 가장 빠르고 효율적

🔧 기본 사용법

1단계: 한 줄 읽기

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();  // "20 10 35 30 7" 전체를 읽음

2단계: StringTokenizer 생성

StringTokenizer st = new StringTokenizer(line);
// 내부적으로 ["20", "10", "35", "30", "7"]로 분리됨

3단계: nextToken()으로 하나씩 꺼내기

String token1 = st.nextToken();  // "20"
String token2 = st.nextToken();  // "10"  
String token3 = st.nextToken();  // "35"
// ... 순서대로 하나씩 반환

💡 비유로 이해하기

StringTokenizer = 과자 상자

상자를 열면: [🍪 🍪 🍪 🍪 🍪]

nextToken() = 과자 하나 꺼내기
1회 호출: 🍪 (첫 번째)
2회 호출: 🍪 (두 번째)
3회 호출: 🍪 (세 번째)
...

한 번 꺼낸 과자는 다시 넣을 수 없음!

📖 주요 메소드

메소드설명반환 타입
nextToken()다음 토큰을 꺼내서 반환String
hasMoreTokens()토큰이 남아있는지 확인boolean
countTokens()남은 토큰 개수 반환int

사용 예시

StringTokenizer st = new StringTokenizer("1 2 3 4 5");

System.out.println(st.countTokens());      // 5
System.out.println(st.nextToken());        // "1"
System.out.println(st.hasMoreTokens());    // true
System.out.println(st.countTokens());      // 4 (하나 꺼냈으니)

🎮 실전 패턴

패턴 1: 두 수 입력받기

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());

System.out.println(A + B);

입력 예시: 10 20
출력: 30

패턴 2: N개 입력받아 배열에 저장

int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());

int[] arr = new int[N];
for (int i = 0; i < N; i++) {
    arr[i] = Integer.parseInt(st.nextToken());
}

입력 예시:

5
1 4 1 2 4

패턴 3: 토큰이 있는 동안 반복

StringTokenizer st = new StringTokenizer(br.readLine());

while (st.hasMoreTokens()) {
    int num = Integer.parseInt(st.nextToken());
    // 처리 로직
}

패턴 4: 최소/최대 찾기

StringTokenizer st = new StringTokenizer(br.readLine());

int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;

while (st.hasMoreTokens()) {
    int num = Integer.parseInt(st.nextToken());
    if (num < min) min = num;
    if (num > max) max = num;
}

System.out.println(min + " " + max);

입력 예시: 20 10 35 30 7
출력: 7 35

🔄 split()과 비교

split() 방식

String line = "1 2 3 4 5";
String[] arr = line.split(" ");

// 배열로 전부 저장됨
int a = Integer.parseInt(arr[0]);  // 인덱스 접근
int b = Integer.parseInt(arr[1]);
int c = Integer.parseInt(arr[2]);

특징:

  • 배열에 모든 데이터 저장
  • 메모리 많이 사용
  • 인덱스로 접근 가능
  • 중간 토큰 건너뛰기 쉬움

StringTokenizer 방식

String line = "1 2 3 4 5";
StringTokenizer st = new StringTokenizer(line);

// 순서대로 하나씩만 꺼냄
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());

특징:

  • 필요할 때만 하나씩 꺼냄
  • 메모리 효율적
  • 속도 빠름
  • 순차 접근만 가능

⚠️ 주의사항

1. nextToken()은 순서대로만 가능

StringTokenizer st = new StringTokenizer("1 2 3");

st.nextToken();  // "1"
st.nextToken();  // "2"
// "1"로 다시 돌아갈 수 없음!

2. 토큰보다 많이 호출하면 에러

StringTokenizer st = new StringTokenizer("1 2");

st.nextToken();  // "1"
st.nextToken();  // "2"
st.nextToken();  // ❌ NoSuchElementException 발생!

해결책: hasMoreTokens()로 먼저 확인

while (st.hasMoreTokens()) {
    String token = st.nextToken();  // ✅ 안전
}

3. 구분자 지정 가능

// 기본: 공백으로 구분
StringTokenizer st1 = new StringTokenizer("1 2 3");

// 콤마로 구분
StringTokenizer st2 = new StringTokenizer("1,2,3", ",");

// 여러 구분자 사용
StringTokenizer st3 = new StringTokenizer("1,2:3;4", ",:;");

🎯 언제 사용할까?

StringTokenizer를 사용하는 경우

  • 대용량 입력 처리
  • 공백으로 구분된 데이터
  • 순차적으로 하나씩 처리
  • 시간 제한이 빡빡한 문제

split()을 사용하는 경우

  • 소량의 데이터
  • 배열로 저장 필요
  • 특정 인덱스 접근 필요
  • 코드 간결성 우선

📝 완전한 예제

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 첫 줄: N 입력
        int N = Integer.parseInt(br.readLine());
        
        // 둘째 줄: N개의 숫자 입력
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        
        for (int i = 0; i < N; i++) {
            int num = Integer.parseInt(st.nextToken());
            
            if (num < min) min = num;
            if (num > max) max = num;
        }
        
        System.out.println(min + " " + max);
        br.close();
    }
}

입력:

5
20 10 35 30 7

출력:

7 35

🔚 정리

  1. StringTokenizer = 문자열을 공백 기준으로 잘라주는 도구
  2. nextToken() = 토큰을 순서대로 하나씩 꺼내는 메소드
  3. hasMoreTokens() = 토큰이 남았는지 확인
  4. BufferedReader + StringTokenizer = 가장 빠른 입력 방식
  5. 대용량 입력 처리에 필수!

0개의 댓글