입력과 버퍼의 관한 정리
우선 우리가 키보드를 통해 키입력을 받으면 입력받은 내용이 버퍼라는 기억공간에 저장이 된다.
또한 콘솔에서 아무 키만 입력된다고해서 입력이 되는것이 아니라 마지막에 엔터키를 눌러야 지금까지 눌렀던
내용이 버퍼에 전달되어 저장이 된다.
먼저 키보드로 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());
이렇게 아예 한줄, 즉 개행문자까지 가져온뒤에(어차피 버려지므로) 정수형으로 반환하는 것이다.
'IT' 카테고리의 다른 글
SQL과 NoSQL (0) | 2022.11.27 |
---|---|
인덱스(INDEX)의 필요성 (1) | 2022.11.23 |
클래스와 객체, 인스턴스 (0) | 2022.11.16 |
오버로딩과 오버라이딩 (0) | 2022.11.16 |
Kubernetes(쿠버네티스) 2 CNI 설치 및 실행, taint (0) | 2022.11.14 |