JAVA - Scanner사용 및 훈련
앞에서 배운 변수, 연산자, 조건문, 반복문은 프로그래밍의 기본이라고 한다.
그러므로 이 기능들을 잘 다루는 것이 중요한데, 지금까지의 학습엔 사용자의 입력이 없었다는 것이다.
이번 시간에는 사용자의 입력을 받는 방법을 배워서 좀 더 그럴싸한 프로그램을 만들어 보자.
Scanner
- 'System.out' 을 통해서 출력을 했듯이, 'System.in' 을 통해서 사용자의 입력을 받을 수 있다. 그런데 자바가 제공하는 `System.in` 을 통해서 사용자 입력을 받으려면 여러 과정을 거쳐야 해서 복잡하고 어렵다.
자바는 이런 문제를 해결하기 위해 'Scanner' 라는 클래스를 제공한다. 이 클래스를 사용하면 사용자 입력을 매우 편리하게 받을 수 있다.
Scanner 예제
Scanner scanner = new Scanner(System.in);
System.out.print("문자열을 입력하세요 : ");
String str = scanner.nextLine();// 입력을 String으로 가져온다.
System.out.println("입력한 문자열 : " + str);
System.out.print("정수를 입력하세요 : ");
int intValue = scanner.nextInt();
System.out.println("입력한 정수 : " + intValue);
System.out.print("실수를 입력하세요 : ");
double doubleValue = scanner.nextDouble();
System.out.println("입력한 실수 : " + doubleValue);
Scanner scanner = new Scanner(System.in);
- 객체와 클래스를 배워야 정확하게 이해할 수 있어서 지금은 간단하게 Scanner 기능을 사용하기 위해 new를 입력해서 Scanner를 만든다 라는 정도로 이해하면 될 거 같다. Scanner는 System.in을 사용하여 사용자의 입력을 편리하게 받도록 도와준다.
- Scanner scanner 코드는 scanner 변수를 선언하는 것이다. 이제부터 scanner라는 변수를 통해 scanner를 사용할 수 있다.
scanner.nextLine();
- 엔터(\n)을 입력할 때까지 문자를 가져온다.
scanner.nextInt();
- 입력을 int 형으로 가져온다. 정수 입력에 사용한다.
scanner.nextDouble();
- 입력을 double 형으로 가져온다. 실수 입력에 사용한다.
print() vs printIn()
- 출력 결과를 보면 바로 이해가 쉬울 것이다.
System.out.print("hello");
System.out.print("world");
//결과: helloworld
System.out.println("hello");
System.out.println("world");
//결과:
hello
world
이 것들을 통해 여러가지 예제를 풀어보았다.
두 수를 입력받고 그 합을 출력하는 예제
Scanner scanner = new Scanner(System.in);
System.out.print("첫 번째 숫자를 입력하세요 : ");
int num1 = scanner.nextInt();
System.out.print("두 번째 숫자를 입력하세요 : ");
int num2 = scanner.nextInt();
int sum = num1 + num2;
System.out.println("두 수의 합 : " + sum);
사용자로부터 두 개의 정수를 입력받고,, 더 큰 수를 출력하는 예제
Scanner scanner = new Scanner(System.in);
System.out.print("첫 번째 숫자를 입력하세요 : ");
int num1 = scanner.nextInt();
System.out.print("두 번째 숫자를 입력하세요 : ");
int num2 = scanner.nextInt();
if (num1 > num2) {
System.out.println(num1);
} else if (num1 < num2) {
System.out.println(num2);
} else {
System.out.println("두 숫자는 같습니다.");
Scanner 반복 예제
- 앞 예제들은 한 번의 결과 출력 후 종료되는 일회성 프로그램이었다면, 지금부터는 사용자의 입력을 지속적으로 받아들이고, 반복하는 예제들을 만들어보자.
Scanner 반복 예제 1
- 사용자가 입력한 문자열을 그대로 출력하는 예제를 만들어보자
- exit라는 문자가 입력되면 프로그램을 종료한다.
- 프로그램은 반복해서 실행된다.
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("문자열을 입력하세요(exit : 종료)");
String str = scanner.nextLine();
if (str.equals("exit")) {
System.out.println("프로그램을 종료합니다.");
break;
}
System.out.println("입력한 문자열 : " + str);
Scanner 반복 예제 2
- 첫 번째 숫자와 두 번째 숫자를 더해서 출력하는 프로그램을 만들어보자
- 첫 번째 숫자와 두 번째 숫자 모두 0을 입력하면 프로그램은 종료된다
- 프로그램은 반복해서 실행된다.
Scanner scanner = new Scanner(System.in);
System.out.println("첫 번째 숫자와 두 번째 숫자 모두 0을 입력하면 프로그램이 종료됩니다.");
while (true) {
System.out.print("첫 번째 숫자를 입력하세요 : ");
int num1 = scanner.nextInt();
System.out.print("두 번째 숫자를 입력하세요 : ");
int num2 = scanner.nextInt();
if (num1 == 0 & num2 == 0) {
System.out.println("프로그램이 종료됩니다.");
break;
}
int sum = num1 + num2;
System.out.println("두 수의 합 : " + sum);
}
Scanner 반복 예제 3
- 사용자 입력을 받아 그 합계를 계산하는 프로그램을 만들자
- 사용자는 한 번에 한 개의 정수를 입력할 수 있으며, 사용자가 0을 입력하면 프로그램은 종료된다.
- 이 때 프로그램이 종료될 때까지 사용자가 입력한 모든 정수의 합을 출력해야 한다.
Scanner scanner = new Scanner(System.in);
int sum = 0;
System.out.println("사용자가 0을 입력하면 프로그램은 종료됩니다.");
while (true) {
System.out.print("정수를 입력하세요.");
int inputValue = scanner.nextInt();
sum += inputValue;
if (inputValue == 0) {
System.out.println("프로그램이 종료됩니다.");
break;
}
}
System.out.println("sum = " + sum);
Scanner를 통한 연습문제 1 - 홀수 짝수
- 사용자로부터 하나의 정수를 입력받고, 이 정수가 홀수인지 짝수인지 판별하는 프로그램 만들기
Scanner를 통한 연습문제 2 - 변수 값 교환
- a = 10, b = 20이 들어있다. 변수 a와 변수 b의 값을 서로 바꾸기
- (힌트) temp라는 변수를 활용해야 함
Scanner scanner = new Scanner(System.in);
int a = 10;
int b = 20;
int temp;
temp = b;
b = a;
a = temp;
System.out.println("a = " + a);
System.out.println("b = " + b);
- a와 b는 한 번에 서로 교환할 수 없다. a = b라고 하면 a의 값인 10이 사라져 버린다. 바로 a, b 둘 다 20이 되어 버린다.
- a = b 라고 하기 전에 a의 값을 어딘가에 보관해두어야 한다. 그래서 temp라는 변수에 임시로 보관해 두는 것이다.
Scanner를 통한 연습문제 3 - 입력한 숫자의 합계와 평균
- 사용자로부터 여러 개의 숫자를 입력받고, 그 숫자들의 합계와 평균을 계산하는 프로그램을 만들기
- 사용자가 -1을 입력하면 숫자 입력을 종료한다고 가정한다
- 모든 숫자의 입력이 끝난 후에는 숫자들의 합계 sum과 평균 average를 출력하기. 평균은 소수점 아래까지.
Scanner scanner = new Scanner(System.in);
int count = 0;
int sum = 0;
int input = 0;
System.out.println("숫자를 입력하세요. 입력을 중단하려면 -1을 입력하세요 : ");
// 첫번째 방법
// while (true) {
// input = scanner.nextInt();
//
// if (input == -1) {
// System.out.println("시스템이 종료됩니다.");
// break;
// }
// sum += input;
// count++;
// }
// 두번째 방법
while ((input = scanner.nextInt()) != -1) {
sum += input;
count++;
}
double average = (double) sum / count;
System.out.println("입력한 숫자들의 합계 : " + sum);
System.out.println("입력한 숫자들의 평균 : " + average);
Scanner를 통한 연습문제 3 - 상품 구매
- 사용자로부터 상품 정보(상품명, 가격, 수량)를 입력받고, 이들의 총 가격을 출력하는 프로그램을 작성하기. 사용자는 여러 상품을 추가하고 결제할 수 있으며, 프로그램을 언제든지 종료할 수 있다.
- 사용자에게 다음 세 가지 옵션을 제공해야 한다. 1: 상품 입력, 2: 결제, 3: 프로그램 종료. 옵션은 정수로 입력받으며, 옵션을 저장하는 변수의 이름은 'option' 이어야 한다.
- 상품 입력 옵션을 선택하면, 사용자에게 상품명과 가격, 수량을 입력받아야 한다.
- 결제 옵션을 선택하면, 총 비용을총비용을 출력하고 총비용을 '0'으로0' 초기화하세요. (사용자가 총비용을 확인하고, 결제를 완료했다고 가정한다. 따라서 다음 사용자를 위해 총비용을 다시 '0'으로0' 초기화해야 한다.)
- 프로그램 종료 옵션을 선택하면, "프로그램을 종료합니다."라는 메시지를 출력하고 프로그램을 종료하기.
- 위의 세 가지 옵션 외에 다른 값을 입력하면, "올바른 옵션을 선택해 주세요."라는." 메시지를 출력하기.
Scanner scanner = new Scanner(System.in);
int totalSum = 0;
while (true) {
System.out.println("1 : 상품 입력, 2 : 결제, 3: 프로그램 종료");
int option = scanner.nextInt();
scanner.nextLine();
if (option == 1) {
System.out.print("상품명을 입력하세요 : ");
String name = scanner.nextLine();
System.out.print("가격을 입력하세요 : ");
int price = scanner.nextInt();
System.out.print("수량을 입력하세요 : ");
int quantity = scanner.nextInt();
int totalPrice = price * quantity;
System.out.println("상품명 : " + name + ", 가격 : " + price + ", 수량 : " + quantity
+ ", 합계 : " + totalPrice);
totalSum += totalPrice;
System.out.println("totalSum = " + totalSum);
} else if (option == 2) {
System.out.println("총 합계 : " + totalSum);
} else if (option == 3) {
System.out.println("프로그램을 종료합니다.");
totalSum = 0; // 결제되면 초기화하기.
break;
} else {
System.out.println("올바른 옵션을 선택해주세요.");
}
}
- 여기서 totalSum이 제대로 찍히지 않아 계속 고민했었는데 알고보니 while문 안에 처음에 변수를 지정했었다. 그러다보니 while문이 반복해서 돌 때마다 totalSum이 0이 되니 누적합계가 쌓일수가 없었다..