유난스런 개발 기록

[JAVA] Day-4 _ 스캐너 (Scanner) 본문

개념정리/JAVA

[JAVA] Day-4 _ 스캐너 (Scanner)

yourhwan 2023. 1. 11. 01:13

day-4

스캐너 (Scanner)


스캐너 (Scanner) 란? 

    • 스캐너는 키보드라고 생각하면 된다. 즉 입력값을 받아주는 클래스다.
    • Scanner sc 는 키보드에서 입력 된 문자열을 읽어들이는 객체다.
    • System.out 은 출력장치(모니터)를 말한다.
    • System.in 은 입력장치(키보드)를 말한다.
    • sc.nextInt(); 는 정수(int)를 읽어들이는 것인데, 종결자가 공백 또는 엔터이다.
    • 즉, 종결자(공백 또는 엔터) 앞 까지의 입력해준 정수를 읽어온다.
    • sc.nextInt(); 와 sc.nextDouble(); 를 사용하면
    • 스캐너(sc)버퍼에는 종결자(공백 또는 엔터)가 삭제되는 것이 아니라 그대로 남아 있게 된다.
    • sc.nextLine(); 를 사용하면 스캐너 버퍼에 남아있던 찌꺼기를 비울 수 있다.
    • sc.close(); 로 스캐너를 닫아주지 않으면 계속해서 입력을 받기 위해 컴퓨터는 작업을 지속한다.

-예제-

package my.day04.c.scanner;

import java.util.Scanner;

public class Scanner1Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		System.out.print("첫번째 문장을 입력하세요 => ");
		String inputStr = sc.nextLine();

		System.out.println("첫번쨰 입력한 문장 => " + inputStr + "\n");
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		
		System.out.print("정수를 입력하세요 => ");
		int inputNum = sc.nextInt();	// 2023엔터
        
		sc.nextLine(); // 스캐너 버퍼에 남아있던 찌꺼기(엔터)를 싹 비우는 것이 목적이다.
		
		System.out.println("입력한 정수 : => " +inputNum);
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		
		System.out.print("두번째 문장을 입력하세요 => ");
		inputStr = sc.nextLine();
		
		System.out.println("두번쨰 입력한 문장 => " + inputStr + "\n");
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		
		System.out.print("실수를 입력하세요 => ");
		double inputDbl = sc.nextDouble();

		sc.nextLine(); // 스캐너에 남아있는 찌꺼기를 없애는 목적으로 입력
		
		System.out.println("입력한 실수 : => " +inputDbl);
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		
		System.out.print("단어를 입력하세요 => ");
		String inputWord = sc.next();	//안녕 하세요 호호호

		sc.nextLine(); // 스캐너에 남아있는 찌꺼기를 없애는 목적으로 입력
		
		System.out.println("입력한 단어 : => " +inputWord);	// 안녕
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		
		System.out.print("세번째 문장을 입력하세요 => ");
		inputStr = sc.nextLine();
		
		System.out.println("세번쨰 입력한 문장 => " + inputStr + "\n");
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		
		
		sc.close();
	}

}

여기까지는 기본적인 스캐너 사용법이다.

학원 수업시간에 예외처리를 함께 적용한 문제도 있다.

package my.day04.c.scanner;

import java.util.*;
// import java.util.InputMismatchException;
// import java.util.Scanner;

public class Scanner4Main {

	public static void main(String[] args) {

		System.out.println("== 키보드로 부터 2개의 정수를 입력 받아서 더한 결과 알아보기 == \n");
		
		Scanner sc = new Scanner(System.in);
		
		String inputStr = "";
		
		try {
		
		System.out.println("1. 첫번째 정수 : ");
		inputStr = sc.nextLine(); // "안녕하세요"
		
		int num1 = Integer.parseInt(inputStr);
		
		System.out.println("2. 두번째 정수 : ");
		inputStr = sc.nextLine();	//"20"
									//"좋은하루"
		
		int num2 = Integer.parseInt(inputStr);
		
		System.out.println(">> 더한 결과 : "+num1+"+"+num2+"="+(num1+num2));
		// >> 더한 결과 : 10+20=30
		
	} //end of try
		catch(NumberFormatException e) {
			System.out.println(inputStr+"는 정수가 아니므로 정수로 입력하세요!! <<");
		}
		
		sc.close();
	}

}

형변환과 예외처리까지 같이 적용한 문제인데, 생각보다 어렵지는 않았다. 

조금 걱정이 되는 부분은 for문과 같이 사용할 떄인데...

 

 

나중에 배울 if문과 switch 문을 예습하며 같이 적용해봤다. 

스캐너로 두개의 정수와 사칙연산을 입력 받아 계산을 해주는 프로그램이다.

 

package my.day04.c.scanner;

import java.util.Scanner;

public class Scanner5Main {

	public static void main(String[] args) {

		System.out.println("== 키보드로 부터 2개의 숫자를 입력 받아서 사칙연산(+ - * /)한 결과 알아보기 == \n)");
	
		Scanner sc = new Scanner(System.in);
		String inputStr = "";
	try {
		System.out.print(">> 첫번째 정수 입력 : ");
		inputStr = sc.nextLine(); // "25"
										 // "똘똘이"
		
		
		
		// "문자열"을 int 타입으로 형변환 시켜주는 방법\
		int num1 = Integer.parseInt(inputStr);
		
		System.out.print(">> 두번째 정수 입력 : ");
		inputStr = sc.nextLine(); // "25"
								  // "똘똘이"
		
		// "문자열"을 int 타입으로 형변환 시켜주는 방법\
		int num2 = Integer.parseInt(inputStr);
		
		System.out.println(">> 사칙연산(+ - * /) 선택");
		String operator = sc.nextLine(); // "+"
										 // "-"
										 // "*"
										 // "/"
										 // "몰라요"
										 // "abcd"
 		
		double result = 0;
		boolean b_flag = true;
		
		switch (operator) {
			// operator 에 들어올 수 없는 타입은 byte, short, int, char, String 만 가능하다. 즉 실수타입은 불가하다.
			case "+":
				result = num1 + num2;
				break; // break를 만나면 switch문장을 빠져나간다.
				
			case "-":
				result = num1 - num2;
				break; // break를 만나면 switch문장을 빠져나간다.
				
			case "*":
				result = num1 * num2;
				break; // break를 만나면 switch문장을 빠져나간다.
				
			case "/": 
				result = (double)num1 / num2;
				break; // break를 만나면 switch문장을 빠져나간다.
				
			default:
				b_flag = false;
				System.out.println(">> "+operator+" 는 사칙연산(+ _ * /)가 아니므로 계산이 불가합니다.!! <<");
				break; // break를 만나면 switch문장을 빠져나간다.
				
		
		}// end of switch (operator)--------------------------------------
		
		if(b_flag) {
			if("/".equals(operator)) {
			System.out.println(">> 결과 : " + num1 + operator + num2 + "=" + result );
			}
			else {
			System.out.println(">> 결과 : " + num1 + operator + num2 + "=" + (int)result );
			}
		}
		
		
	} catch(NumberFormatException e) {
		System.out.println(">> "+inputStr+" 은(는) 정수가 아닙니다. 정수만 입력하세요!! <<");
		
		}
		
		sc.close();
		
	}// end of main()---------------------------------------------
	

}