혼자/Java

[Java] next(), nextLine() 차이

닉네임생각즁 2024. 1. 4. 23:52

 

⭐ 찾게 된 계기

            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();

            if(n == 0) {
                checkReName(reInfo);
            } else if(n == 1) {
                System.out.print("식당을 선택해주세요 : ");
                String re = sc.nextLine();
                for(int i=0; i<reInfo.size(); i++) {
                    if(reInfo.get(i).getReName().equals(re)) {
                        System.out.println(reInfo.get(i).getReMenu());
                    }
                }
            } else if(n == 2) {

            }

 

자바 프로젝트 연습하던 도중 만난 오류 아닌 오류😮

1을 입력할 경우 식당 이름을 입력하는 단계로 넘어가도록 만들려고 한건데

1 입력 후 식당 이름을 입력하려고 하면 입력이 안됐다

 

 

실수 했던 코드를 집에 와서 인텔리제이로 다시 해보니까 이렇게 정확히 프로그램이 종료됐음이 표시되어서 알기 쉬웠다 근데 강의실에서 이클립스로 할 때는 선택해주세요 떠있는 상태에서 더이상 입력만 안되고 프로그램이 종료된지는 정확히 보이는게 없어서 뭐가 문제인건지 헷갈렸다 scanner 객체는 한번 쓰면 또 못썼던가? 다음 입력받으려면 다시 선언해줘야하나? 뭐가 문제지? 이런 생각만 들었고

 

            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();

            if(n == 0) {
                checkReName(reInfo);
            } else if(n == 1) {
                System.out.print("식당을 선택해주세요 : ");
                Scanner sc2 = new Scanner(System.in);
                String re = sc2.nextLine();
                for(int i=0; i<reInfo.size(); i++) {
                    if(reInfo.get(i).getReName().equals(re)) {
                        System.out.println(reInfo.get(i).getReMenu());
                    }
                }
            } else if(n == 2) {

            }

 

그래서 이렇게 scanner 객체를 한번더 선언해서 써줬다

입력때마다 선언을 매번 했던 기억은 없어서 살짝 찝찝하긴 했지만

 

 

이렇게 제대로 돌아가니까 scanner를 한번 더 생성해주는게 맞나보다하고 넘어가려던 찰나,,!

scanner는 한번 만들어주면 그 이후에 계속 쓸 수 있다는 친구의 등장과 함께 여럿이 모여서 토론을 하기 시작했다ㅋㅋㅋㅋㅋㅋㅋ다시 찾아보며 이야기를 나눴고 nexLine()의 특성때문에 일어난 일이었다는걸 알게 되었다 

 

바꾼 코드는 이렇다

 

            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();

            if(n == 0) {
                checkReName(reInfo);
            } else if(n == 1) {
                System.out.print("식당을 선택해주세요 : ");
                String re = sc.next();
                for(int i=0; i<reInfo.size(); i++) {
                    if(reInfo.get(i).getReName().equals(re)) {
                        System.out.println(reInfo.get(i).getReMenu());
                    }
                }
            } else if(n == 2) {

            }

nextLine()을 next()로 바꾸면 해결되는거였다

 

 


⭐⭐ next()와 nextLine()의 차이

 

next()

- 엔터 or 스페이스 기준으로 끊어짐

- 버퍼에 문자+엔터(스페이스)가 들어가는데 입력한 문자만 빼가고 엔터는 버퍼에 남겨둠

- 다음 next()는 엔터 안 읽고 다음 문자를 읽음

 

nextLine()

- 한줄(엔터) 기준으로 끊어짐

- 버퍼에 문자+엔터 들어가는데 엔터까지 포함해서 빼감

- 그전에 next() or nextInt()를 쓴 후 버퍼에 엔터가 남아있는 상황이라면 그걸 인식해서입력이 끝났구나! 하고 종료시켜버림 (엔터를 마주친 순간 입력의 끝이라 판단하고 엔터포함 빼가기때문에) 

 

nextLine()은 버퍼를 비워줄때(엔터를 없애줄때) 써도 유용하겠다!


 

"1" 입력 → "엔터" 입력  → "식당을 선택해주세요 : " 출력 → "식당 이름" 입력

이렇게 할 생각이었는데 nextInt()는 next()와 마찬가지로 엔터를 제외한 숫자 1만 빼가는거라 버퍼에는 엔터가 남겨진 상태였다 이때 다시 next() or nextInt()를 써줬다면 엔터를 넘기고 문자 or 숫자를 입력받은 후 그 내용을 읽어가는데, nextLine()은 엔터를 한줄의 끝으로 인식하며 엔터까지 포함해서 빼가는 애라서 버퍼에 남아있는 엔터를 보고 입력이 끝났구나! 하면서 종료가 됐던거였다 !!!

버퍼 입장에서 생각하면 더 이해하기 쉬움

 

 

만약 nextLine()을 쓰고싶다면 

sc.nextLine();
String re = sc.nextLine();

nextLine()으로 엔터를 빼준 후 또 nextLine()을 써서 다음 문자를 받으면 된다

 

 

완전 기초적인 내용이지만 헷갈릴 수 있는 내용인데 친구들이랑 대화하면서 확실히 정리가 됐다 절대 안 까먹을듯!!

헷갈리는게 있으면 여러명한테 물어보면서 같이 떠들어보는게 좋다는걸 오늘도 느꼈다👍👍

'혼자 > Java' 카테고리의 다른 글

[Java] 커스텀 예외 (Custom Exception)  (1) 2024.01.08
[Java] 객체 지향 문제 연습  (1) 2024.01.03