JDK에서 자바 코드를 작성한걸 자바 컴파일러가 돌려주면, Java Development Kit
JRE는 이 코드를 받아서 필요한 라이브러리와 결합한 다음
이 코드를 실행할 JVM을 시작하는 온디스크 시스템이다. Java Runtime Environment
JRE에는 자바 프로그램 실행에 필요한 라이브러리와 소프트웨어가 포함된다.
JVM은 참고로 자바 바이트코드를 실행하는 실행기이다.
Java Virtual Machine
즉, 자바는 아래와 같은 구조를 가진다.
그리고 다음과 같은 실행 순을 가지고 있다.
이때, JRE의 메모리 구조는 아래와 같다고 설명한다.
또 이때
스택과 힙의 관계는 아래와 같다.
그렇다. 사실,
이 모든 것은 자바에서 Scannner를 사용시
정수 변수를 스캐너로 입력받은 다음 스트링 변수를 받을 경우
꼭 nextLine()을 작성해줘야하는 이유에 대한 것이었다.
(그렇기 않으면 논리오류가 발생!)
Scanner.nextInt 메소드는 사용자 입력의 가장 마지막 개행문자(\n)를 제거하지 않고
개행문자(\n) 전까지만 숫자로 입력 받기때문에
다음에 호출된 Scanner.nextLine( )에서 개행문자(엔터)까지 메소드의 입력으로 처리되서 문제가 발생하게 된다.
선생님 설명
/*Scanner에는 한가지 버그가 존재하는데
*nextInt(), nextDouble()과 같은 숫자를 입력하는 메소드를 실행하고 나면은
*버퍼메모리에 우리가 입력했던 엔터키(\n)가 남아있는 버그가 있다.
*엔터키가 남아있는 상태에서 계속해서 숫자를 입력받는 메소드를 실행하면 문제가 없겠지만
*만약 nextLine()을 실행하게 되면?
*nextLine()은 버퍼메모리에 남아있는 엔터키를 보고
*사용자가 입력을 종료했다 라고 생각을 하고,
*공백 제거등의 단계를 거쳐서
*아무런 내용도 없는 String 값("")을 보내주게 된다.
*이 ""을 곧장 String 변수에 저장하게 되면?
*해당 String변수도 아무런 내용 없는 String 변수가 되게 된다.
*따라서 이 버그를 해결하기 위해서는
*실제 변수에 저장하는 nextLine()을 실행하기 전에
*nextLine()을 한번 더 실행시켜서 엔터키를 버퍼메모리에서 날려버리면 된다.
*/
그래서 꼭 Scanner.nextLine(); 코드를 한 번 더 작성해줘야됨!
퀴즈: 이름과 점수를 입력받아 출력해보기
답은 아래에
Scanner scanner = new Scanner(System.in);
System.out.println("이름을 입력해주세요.");
System.out.println("> ");
/* 버퍼메모리의 엔터 키를 없애기 위해
* scanner.nextLine()을 한번 실행시킨다.
*/
scanner.nextLine();
String name = scanner.nextLine();
System.out.println("점수을 입력해주세요.");
System.out.print("> ");
int score = scanner.nextInt();
System.out.printf("이름: [%s] 점수: [%d]점\n ", name, score);
scanner.close();
'STUDY > web' 카테고리의 다른 글
자바 다차원 배열 (0) | 2021.09.14 |
---|---|
자바 배열, 리스트 기초 (0) | 2021.09.14 |
자바 LottoGame 코드 리뷰 (0) | 2021.09.13 |
LET's Star~ PARTY~~! (0) | 2021.09.10 |
9.6 개강 (0) | 2021.09.06 |