본문 바로가기
카테고리 없음

자바(java)의 입력 : Scanner

by 샤샤샤샤 2022. 11. 16.

입력

import : 외부 라이브러리의 클래스를 가져오는 내장 함수

import java.util.Scanner;
// import 임포트 : 외부라이브러리 (jdk) 클래스를 사용할때 사용함.

public class ex09 {
    public static void main(String[] args) {
        //scanner 클래스를 이용한 키보드 입력을 받는다.
        // 프로그램 연습용 문자열을 입력받기 위해서

        Scanner scan = new Scanner(System.in);
        //클래스명
        // 객채명 = new 클래스명(매개변수);
        // new : 객체 생성 예약어
        // 매개변수 : 함수의 입력값
        // System.in : 매개변수 - 콘솔 입력을 받는다는 의미.
        // 콘솔(Console) : 표준 입출력장치 = 키보드, 모니터를 의미.

        // 콘솔로부터 한줄 문자열을 입력받음.
        // 뫁솔에 문자열을 입력하고 엔터를 치면 됨.

        System.out.println("문자열을 입력하세요:");
        String strInput = scan.nextLine();
        System.out.println("입력된 값:" + strInput);
        scan.close(); // Scanner 객체가 할당한 자원(메모리)를 해제한다.

    }
}

 

Scanner: 키보드 입력을 받기 위해 불러온 클래스

 

Scanner scan = new Scanner(System.in);

외부 라이브러리를 사용하는 방식.

[사용할 클래스] [객체명] = new [사용할 클래스](매개변수)

이해가 될듯도 한데 아직 좀더 배워야 확실하게 이해가 될듯.

 

Scanner클래스의 다양한 함수들
 nextLine() : 문자열입력, 공백포함 한줄모두 입력받음.
             "i am a boy"엔터 -> "i am a boy"
 next() : 문자열입력, 공백(스페이스)까지만 입력받음.
            "i am a boy"엔터 -> "i"
 nextInt() : 문자열을 입력받아서 정수(int)로 반환해 줌
 nextFloat() : 문자열을 입력받아서 실수(float)로 반환해 줌
 nextDouble() : 문자열을 입력받아서 실수(double)로 반환해 줌

옳바른 형식의 데이터를 받은게 아닐 경우, 예외(exceptino)이 발생하며 프로그램이 멈춘다.

Exception in thread "main" java.util.InputMismatchException

이 예외는 

 

1. 틀린 형식의 데이터를 넣었을 때

2. 허용된 범위를 넘은 데이터를 입력했을 때

 

발생한다.

 

공백을 받을 수 없는 next()함수에 공백이 포함된 문장을 넣는다고 가정해보자.

next()   <- "하하 호호"  입력

이 경우 역시 위의 에러가 발생한다.

버퍼 메모리에 "하하 호호"라는 데이터가 저장되어 처리되기를 기다리고 있는데, next()함수로는 처리할수 없어 버퍼 메모리를 여전히 차지하고 있기 때문이다. 이는 버퍼 메모리를 비워줘야 해결이 된다. 따라서 "하하 호호"라는 데이터를 처리할수 있는 옳바른 함수를 실행시키면 해결된다.

import java.util.Scanner;
public class ex12 {
    public static void main(String[] args) {
//        Scanner클래스의 다양한 함수들
//         nextLine() : 문자열입력, 공백포함 한줄모두 입력받음.
//                     "i am a boy"엔터 -> "i am a boy"
//         next() : 문자열입력, 공백(스페이스)까지만 입력받음.
//                    "i am a boy"엔터 -> "i"
//         nextInt() : 문자열을 입력받아서 정수(int)로 반환해 줌
//         nextFloat() : 문자열을 입력받아서 실수(float)로 반환해 줌
//         nextDouble() : 문자열을 입력받아서 실수(double)로 반환해 줌
        Scanner scan = new Scanner(System.in);
//        System.out.println("nextLine()로 입력");
//        String msg1 = scan.nextLine(); //i am a boy 엔터
//        System.out.println( msg1 );
        System.out.println("netx()로 입력");
        String msg2 = scan.next(); // i am a boy 엔터
        System.out.println( msg2 );

        // InputMismatchException 오류 = 에러 = 예외(익셉션) = 버그(bug)
        // 원인 : next() 함수의 버퍼메모리 공간이 Clear 되지 않아서이다.
        // 해결 : nextLine()을 한번 수행해준다.
        scan.nextLine();

        System.out.println("nextDouble()으로 입력");
        double num2 = scan.nextDouble(); //10엔터
        System.out.println( num2 *2 );
        scan.close();

Scanner 클래스를 사용하고 나서는 반드시 scan.close() 함수를 통해 닫아주도록 하자.(프로그램이 알아서 닫아주기는 하는데, 그래도 사용자가 직접 닫는게 옳바른 코딩 방식이다.)

 

참고로 String형식으로 데이터를 받아 나중에 Integer 내장 함수를 이용해 형식을 변환하는 방식도 있다.

String strInput2 = scan.nextLine();
int num1 = Integer.parseInt( strInput2 );

허나 번거로워서 많이 사용하지는 않는다.

 

Integer을 사용해 다양한 진수의 표현도 가능하다.

public class ex14 {
    public static void main(String[] args) {
        // 진수 표현법
        // 십진수 (十進數) : 열개가 되면 자릿수가 증가해서 표현.
        // 2진수: 10 = 1010, 15 = 1111
        // 8진수
        // 16진수: 10 = a, 15 = f

        // 2진수 출력
        int i =10;
        String binaryString = Integer.toBinaryString(i);
        System.out.println(binaryString);

        //8진수 출력
        String octalString = Integer.toOctalString(i);
        System.out.println(octalString);

        // 16진수 출력
        String hexString = Integer.toHexString(i);
        System.out.println( hexString );
    }