package scanner.ex;
import java.util.Scanner;
public class ScannerWhileEx4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int totalCost = 0;
while (true) {
System.out.println("1: 상품 입력, 2: 결제, 3: 프로그램 종료");
int option = input.nextInt();
if (option == 1) {
input.nextLine();
System.out.print("상품명을 입력하세요: ");
String product = input.nextLine();
System.out.print("상품의 가격을 입력하세요: ");
int price = input.nextInt();
System.out.print("구매 수량을 입력하세요: ");
int quantity = input.nextInt();
totalCost += price * quantity;
System.out.println("상품명:" + product + " 가격:" + price + " 수량:" + quantity + " 합계:" + price * quantity);
} else if (option == 2) {
System.out.println("총 비용: " + totalCost);
totalCost = 0;
} else if (option == 3) {
System.out.println("프로그램을 종료합니다.");
break;
} else {
System.out.println("올바른 옵션을 선택해주세요.");
}
}
}
}
위의 코드에서 왜 개행문자를 제거하기 위해 nextLine()메서드를 사용하는 것일까?
또한, 왜 int price = input.nextInt(); 줄 아래로는 개행문자 제거를 하지 않는가?
nextInt()메서드는 정수만 받아드린다. 그래서 개행문자 엔터를 하였을 때, 그 엔터는 이후의 nextLine()메서드를 사용할 시에 적용이 된다. 물론, nextInt()메서드는 계속 정수만 받아들이기 때문에 이후 사용시에도 영향이 없다.
이 Java 프로그램은 사용자로부터 제품 정보를 입력받아 제품명, 가격, 수량을 포함하는 간단한 콘솔 응용 프로그램입니다. 사용자는 제품을 입력하고 결제하거나 프로그램을 종료하는 옵션을 선택할 수 있습니다. 이 프로그램은 사용자가 종료 옵션을 선택할 때까지 메뉴를 표시하고 사용자 입력을 처리하는 무한 루프인 while (true) 루프를 사용합니다.
제가 언급한 코드 부분에 대한 설명을 제공해 드리겠습니다.
int price = input.nextInt();
이 코드는 사용자 입력에서 정수를 읽어들이는 부분으로, 제품의 가격을 나타냅니다. nextInt() 메서드는 입력에서 다음 정수를 읽어들입니다. 참고로, Enter 키를 누른 후에 남아 있는 개행 문자(newline character)는 소비하지 않습니다.
그러나 이 코드 전에 다음과 같은 부분이 있습니다.
input.nextLine(); // 이전에 입력된 개행문자 제거
이 코드는 사용자가 옵션(1, 2 또는 3)을 입력한 후에 입력 버퍼에 남아 있는 개행 문자를 소비하기 위해 사용됩니다. 이 부분이 없으면 뒤이어 나오는 nextLine() 메서드가 즉시 개행 문자를 소비하게 되어 예상치 못한 동작이 발생할 수 있습니다.
개행 문자를 소비한 후에 프로그램은 다음과 같이 제품명을 읽어들입니다.
String product = input.nextLine();
이미 개행 문자가 소비되었기 때문에 이 nextLine() 호출은 사용자가 입력한 실제 내용을 읽어들입니다.
요약하면, 제품명을 읽기 전에 있는 input.nextLine()는 사용자가 옵션을 입력한 후에 남아 있는 개행 문자를 처리하기 위해 필요합니다. 이를 통해 이후의 nextInt() 및 nextLine() 호출이 의도대로 작동하고 사용자 입력을 건너뛰지 않도록 보장합니다.