Programming Language/Java

[Java] nextInt()와 nextLine() 혼합 사용 문제

LeeJaeJun 2024. 12. 21. 16:01
728x90
반응형
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {	
		Scanner scanner = new Scanner(System.in);
		
		int n = scanner.nextInt();
		
		for(int i = 0; i < n; i++) {
			String line = scanner.nextLine();
            
			if (line.trim().isEmpty()) {
				break;
			}
			
			String[] parts = line.split(",");
			
			int a = Integer.parseInt(parts[0]);
			int b = Integer.parseInt(parts[1]);
			
			System.out.println(a+b);
		}
		scanner.close();
	}
}

 

scanner.nextInt()로 값을 입력받은 뒤, scanner.nextLine()을 사용하여 문자열을 읽을 때 예상치 못한 빈 줄이 입력이 됩니다. 이 문제를 해결하려면 nextInt()로 숫자를 읽은 후, nextLine()을 한 번 호출해 남은 줄바꿈 문자를 제거해야 합니다.

문제의 원인

scanner.nextInt()는 숫자만 읽고, 그 뒤에 있는 **줄바꿈 문자(\n)**는 입력 버퍼에 그대로 남겨두기 때문에, 그 다음에 호출되는 scanner.nextLine()은 이 남은 줄바꿈 문자를 읽어서 빈 줄로 간주합니다. 이로 인해, 코드가 의도대로 동작하지 않고 첫 번째 줄에서 빈 값이 들어가게 됩니다.

 

해결 방법

이를 해결하기 위해선 nextInt()로 숫자를 입력받은 후, 바로 scanner.nextLine()을 한 번 호출하여 남아 있는 줄바꿈 문자를 제거해줘야 합니다. 이렇게 하면 그 다음부터 정상적으로 입력을 받을 수 있습니다.

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {	
		Scanner scanner = new Scanner(System.in);
		
		int n = scanner.nextInt();
		
        scanner.nextLine(); // 입력 버퍼에서 줄바꿈 제거
        
		for(int i = 0; i < n; i++) {
			String line = scanner.nextLine();
            
			if (line.trim().isEmpty()) {
				break;
			}
			
			String[] parts = line.split(",");
			
			int a = Integer.parseInt(parts[0]);
			int b = Integer.parseInt(parts[1]);
			
			System.out.println(a+b);
		}
		scanner.close();
	}
}

동작 방식

  1. scanner.nextInt()로 숫자 n을 입력받고,
  2. scanner.nextLine()을 호출해 남아 있는 줄바꿈 문자를 처리합니다.
  3. 그 이후부터는 정상적으로 nextLine()을 사용하여 각 줄을 읽고 파싱할 수 있습니다.

 

왜 이렇게 해야 하는지?

nextInt()는 숫자만 읽고 줄바꿈 문자를 처리하지 않기 때문에, 그 뒤에 호출된 nextLine()이 남아있는 줄바꿈 문자만 읽고 빈 문자열을 반환하게 됩니다. 따라서 이 문제를 해결하려면 nextInt()와 nextLine()을 함께 사용할 때, nextInt() 이후에 nextLine()을 한 번 더 호출하여 입력 버퍼를 정리해야 합니다.

728x90
반응형