JAVA

JAVA - Scanner사용 및 훈련

jonghyeon6084 2023. 12. 27. 15:06
728x90

앞에서 배운 변수, 연산자, 조건문, 반복문은 프로그래밍의 기본이라고 한다.

 

그러므로 이 기능들을 잘 다루는 것이 중요한데, 지금까지의 학습엔 사용자의 입력이 없었다는 것이다.

 

이번 시간에는 사용자의 입력을 받는 방법을 배워서 좀 더 그럴싸한 프로그램을 만들어 보자.

 

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이 되니 누적합계가 쌓일수가 없었다..