본문 바로가기
🎯 알고리즘/개념 & 예제

[Java/자바] Scanner 사용법, next()와 nextLine()의 차이점

by 서버요정 호토론 2023. 1. 11.

[학습목표]

💡 자바에서 입출력 처리를 할 수 있다
💡 자바 스캐너의 사용법을 알아본다
💡 next()와 nextLine()의 차이점을 알아본다

🚩여기서 잠깐 토막상식!

※ 필요한 사전지식? 표준 입출력, 스트림

 

1. Scanner란?

java.util.Scanner

  • 파일, 입력 스트림 등에서 데이터를 읽어 구분자로 토큰화하고 다양한 타입으로 형변환하여 리턴해주는 클래스
  • 같은 방법으로 파일, 문자열 등 다양하게 데이터를 읽어들일 수 있어 편리하다
    • Scanner(File source)
    • Scanner(InputStream source)
    • Scanner(String source)
  • 입력 스트림을 다루는 방법을 몰라도 손쉽게 입력처리 가능
  • 데이터 형변환으로 인한 편리함
  • 대량의 처리시 수행시간이 비효율적임 (느리다)

 

 

2. Scanner의 주요 메서드

메서드 명 특징
nextInt() - int 타입 반환
- white space를 만나면 종료
nextDouble() - double 타입 반환
- white space를 만나면 종료
next() - String 타입 반환
- white space를 만나면 종료
nextLine() - String 타입 반환
- 개행문자(Enter)를 만나면 종료
- next()와 달리 문자열 안에 띄어쓰기를 할 수 있음 (공백을 포함할 수 있음)

nextInt(), nextDouble(), next()의 구분자는 공백문자 (space, tab, \n) 이고

nextLine()의 구분자는 개행문자(\n)이다.

 

따라서 "Hello World"라는 문자열이 주어졌을 때

next()Hello, World 이렇게 각각 단어만 받을 수 있고

nextLine()Hello World 이렇게 문장으로 띄어쓰기를 포함하여 받을 수 있다

 

2-1. next() 사용예제

import java.util.Scanner;

public class IO1_ScannerTest {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); //표준입력스트림을 스캐닝
        System.out.println("정수, 실수, 문자열을 차례로 입력하세요.");

        System.out.println("읽은 정수: " + sc.nextInt());
        System.out.println("읽은 실수: " + sc.nextDouble());
        System.out.println("읽은 문자열: " + sc.next()); //White space를 만나면 종료
    }
}

출력결과

next() 사용시 띄어쓰기를 구분자로 인식하여 종료하기 때문에

  • hello world 전체가 아닌 hello만 읽어들인다.
  • 스페이스 여러번 누른게 반영되어있지 않다.

띄어쓰기까지도 유효한 문자로 인식하려면 nextLine()을 사용해야한다.

 

2-2. nextLine() 사용예제

import java.util.Scanner;

public class IO1_ScannerTest {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); //표준입력스트림을 스캐닝
        System.out.println("정수, 실수, 문자열을 차례로 입력하세요.");

        System.out.println("읽은 정수: " + sc.nextInt());
        System.out.println("읽은 실수: " + sc.nextDouble());
        System.out.println("읽은 문자열: " + sc.nextLine()); //개행(/n)을 만나면 종료
    }
}

출력결과

입력에서 누른 띄어쓰기까지도 문자열 안에 포함되어있다.

 

두가지 예제를 통해 next()와  nextLine()이 구분자만 다를 뿐 아니라 처리하는 방법에서 차이가 있음을 알수있다

 

 

 

3. next()와 nextLine()의 차이점

차이점을 알아보기 위해 같은 문자열을 두개의 메서드로 출력해보도록 하자

import java.util.Scanner;

public class IO2_ScannerTest {
    public static void main(String[] args) {
        String s1 = "안 \n녕\n";
        Scanner sc = new Scanner(s1);
        System.out.print("next() 출력값 : \""+sc.next()); //읽은 그대로 출력하기 위해 print()사용
        System.out.print(sc.next()+"\"");
        System.out.println();

        Scanner sc2 = new Scanner(s1);
        System.out.print("nextLine() 출력값 : \""+sc2.nextLine()); //읽은 그대로 출력하기 위해 print()사용
        System.out.print(sc2.nextLine()+"\"");
    }
}

출력결과

next()는 "안녕" 두글자가,

nextLine()은 "안 녕" 세글자가 출력되었다

같은 문자열을 출력했는데 왜 결과값이 다를까?

 

2-1. next() 의 처리 방법

  1. next()는 커서의 시작부터 구분자(white space) 직전까지 읽어들인 후 유효문자만 출력한다.
    이때 구분자는 남겨둔다.
  2. 남아있는 구분자는 무시하고 다음 유효문자부터 구분자 직전까지 읽어들인 후 유효문자만 출력한다.
  3. 유효문자가 없으면 남아있는 구분자는 버리고 종료한다.
  4. 결과적으로 읽어들인 문자는 "안", "녕" 두글자이다.

 

2-2. nextLine() 의 처리 방법

  1. nextLine()은 커서의 시작부터 구분자(\n)가 나올때까지 읽어들인 후 유효문자를 출력한다
    개행만 구분자로 취급하기 때문에 space는 유효문자로 처리한다.
    이때 구분자는 삭제 후 다음 글자를 읽는다
  2. 다음 유효문자부터 구분자 직전까지 읽어들인 후 유효문자만 출력한다.
    마찬가지로  구분자는 삭제 후 다음 글자를 읽는다
  3. 더이상 읽어들일 문자열이 없으면 종료한다
  4. 결과적으로 읽어들인 문자는 "안", " ", "녕" 세글자이다

 

이렇게 next()는 구분자를 남겨두고 nextLine()은 구분자를 떼고 넘겨주는 것을 알게 되었다

 

2-3. next()와 nextLine() 동시에 사용하기

같은 메서드끼리 쓸때는 상관없지만 성격이 다른 메서드를 함께쓸 때는 앞에 남겨둔 구분자를 유효문자로 처리해서 출력값에 문제가 생기지 않도록 주의해야 한다.

import java.util.Scanner;

public class IO3_ScannerTest {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("나이 : " + sc.nextInt());
        sc.nextLine(); //남아있는 구분자 제거
        System.out.println("이름 : " + sc.nextLine());
    }
}

이렇게 구분자 제거용 nextLine()을 추가하면 정상적으로 출력할 수 있다. 

 

댓글