ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] next(), nextLine() 의 차이
    Language/Java 2020. 1. 16. 20:14
    728x90
    반응형

    나는 지금까지 next()nextLine()의 차이는 단순히 한 줄을 전부 입력받고 싶을 때(한 문장을 입력한다던지)는 nextLine()을 사용하고 한 단어씩 입력하고자 할 때는 next()를 사용한다 정도의 가볍게 알고있었다.

    하지만 약간의 차이점은 존재했고 주의사항을 확실하게 짚고 넘어가고자 한다.

     

    next(), nextLine()는 Scanner 클래스의 메소드이다. 공통점은 둘다 문자열로 반환을 시켜준다는 점이고 차이점개행문자를 무시하냐 안하냐의 차이라고 할 수 있다.

     

     

     

    메소드 참고

     

     

    1. 입출력시 주의사항

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import java.util.Scanner;
     
    public class Test {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
     
            int num;
            String str;
            System.out.println("num입력");
            num = input.nextInt();
     
            System.out.println("str입력");
            str = input.nextLine();
     
            System.out.println("num : " + num);
            System.out.println("str : " + str);
            input.close();
        }
    }
     
     
    s

    출처 : https://sleepyeyes.tistory.com/22

    원래 원했던 입력은 숫자1번, 문자1번 이었을 것이지만, 숫자1번 입력하면 바로 자동으로 출력이 된다.

     

    그 이유가 무엇일까? 

    next()는 개행문자를 무시하고 입력을 받고 nextLine은 한줄 단위로 입력을 받기 때문에 개행문자로 포함한다.

    좀 더 직관적으로 설명하자면 위 처럼 5를 입력하고 Enter를 쳤다면 버퍼에 5\n이 존재한다. 이 때 nextInt()가 버퍼의 내용을 가져올 때 분리자를 제외하고 가져오기 때문에 5만 가져오게 된다. 그러면 버퍼에 \t가 남아있는데 nextLine()은 공백문자, 개행문자인 분리자를 포함시키기 때문에 \t만 가져오고 프로그램이 종료되는 것이다.

     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import java.util.Scanner;
     
    public class Test {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
     
            int num;
            String str;
            System.out.println("num입력");
            num = input.nextInt();
     
            System.out.println("str입력");
            str = input.next();
     
            System.out.println("num : " + num);
            System.out.println("str : " + str);
            input.close();
        }
    }
     
     

    출처 : https://sleepyeyes.tistory.com/22

    위와 같이 nextLine()을 next()로 바꾸어 주는 것도 하나의 방법이다.

     

     

     

     

    입력과 버퍼의 관한 정리 

     

    우선 우리가 키보드를 통해 키입력을 받으면 입력받은 내용이 버퍼라는 기억공간에 저장이 된다.

    또한 콘솔에서 아무 키만 입력된다고해서 입력이 되는것이 아니라 마지막에 엔터키를 눌러야 지금까지 눌렀던

    내용이 버퍼에 전달되어 저장이 된다.

    먼저 키보드로 120<엔터> 라고 입력했다고 가정하자. 참고로 엔터에 해당하는 코드 문자는 \r\n 이다.

    그럼 버퍼에는 120<엔터>라고 들어갈 것이다. 

    입력은 nextInt() 메서드가 실행된이후 버퍼에 내용이 있는지 확인하게 된다. 처음이니 버퍼에 내용은 없다.

    따라서 키보드로부터 사용자의 입력을 기다리는 상태가 되고, 위에 가정한대로 입력을 받게 된다.

    그리고 버퍼에서 공백,탭문자,개행문자(엔터)를 구분으로 해서 하나의 단어를 가져오게 된다.

    버퍼에서는 120까지를 가져오게 됩니다. 그리고 버퍼에는 <엔터> 만 남는다.

    만약 이 뒤에 또다시 nextInt() 메서드가 실행된다면?

    버퍼를 확인해서 비어있는지 살펴봐야한다. 비어있지는 않지만 개행문자만 있으므로 건너띄고 내용이 없으므로

    사용자로부터 입력을 받게 됩니다.

    200<엔터>

    그럼 위에서 실행된 nextInt()는 200이라는 값만 가지고 가게 되고 <엔터> 문자는 남게 된다.

    다음번에 nextLine()이 아닌 메서드가 실행되는 경우 엔터 코드는 무시하고 다음 문자를 찾게 되니깐 상관이 없지만,

    이상태에서 nextLine()메서드를 실행하게 된다면 문제가 약간 생긴다.

    nextLine()을 실행하려는 이유는 한줄의 입력내용을 받기 위함 이다.

    여기서 한줄이라고 함은 처음부터 개행문자(엔터)까지의 문자열을 의미합니다.

     

    한마디로 nextLine()은 분리자도 다 읽어올 수 있고, next(), nextInt()는 분리자는 제외하고 읽어온다.  

    즉, 가<엔터> or 가나다 라마<엔터>

    어떤식으로 입력이 되었든 <엔터> 까지 문자열을 모두 가져오게 되고. 그럼 nextLine()을 실행한 후에는 아무런 값이 남지 않게 된다.

    여기에서 nextLine()은 개행문자를 가져와서 버려지게 되고 개행문자 이전 문자열만 반환하게 되고, 이렇게 nextInt()등을

     

    쓰고 난뒤에 nextLine()을 쓰게되면 위와 같은 현상을 직면하게 되므로,

    int num = sc.nextInt();

    sc.nextLine();

    String str = sc.nextLine();

    이런식으로 중간에 남은 코드를 정리하기 위하여 nextLine();을 실행해주면 된다.

     

    반환문자는 필요없으므로 메서드만 호출하게 되고 그리고 새로 nextLine()을 실행해서 한줄을 받아오게 된다.

    다른 방법으로는 nextInt(); 대신 Integer.parseInt(sc.nextLine());

    이렇게 아예 한줄, 즉 개행문자까지 가져온뒤에(어차피 버려지므로) 정수형으로 반환하는 것이다.

     

     

    반응형

    댓글

Designed by Tistory.