본문 바로가기
Java

[Java]스캐너? 스캐너 정의와 호출, 스캐너를 활용하여 입력값 출력하기

by 나는 개발자 2020. 12. 18.
TIL: 스스로 이해한 것을 바탕으로 정리하였기에 오류가 있을 수 있습니다. 틀린 부분은 댓글로 알려주시면 감사하겠습니다.

스캐너(Scanner)

사용자로부터 입력되는 정수, 실수, 문자열을 처리하는 클래스(Scanner.class)를 이용하여 변수에 기록하는 방법

- 사용자가 입력한 값을 가져오기 위해서는 자바에서 이미 제공하고 있는 java.util.Scanner라는 클래스가 가지고 있는 메소드를 활용하여야 한다. 

 

 

 

스캐너 가져오기

; 다른 클래스에 있는 메소드와 동일한 방법으로 호출하나 차이가 있음

1. import 작성

import java.util.Scanner;

 

2. Scanner 생성 (new)

Scanner sc = new Scanner(System.in);                 

   -> 여기서 차이가 생김 new Scanner( ); 괄호 안에 입력을 받을 것이라고 기술해준다.

       System.in : 입력   System.out : 출력

 

3. 키보드 입력값 받기

String name = sc.nextLine( );

 -  **  next 메소드 : 사용자가 입력한 값을 받아오는 메소드 

 -  메소드 앞에 변수를 입력하지 않으면, 입력된 값을 가지고 오자마자 프로그램이 종료된다.

    가지고 온 값을 어딘가에 기록하기 위해서는 변수에 담아준다.

    (문자열이라면 String)

 

 

 

 

next메소드 종류

1) 문자열 

next( ); : 사용자가 입력한 값 중 공백 이전까지의 값만 읽어옴(주소 같은 공백이 포함될 여지가 있는 문자열 x)

nextLine( ); : 사용자가 입력한 값, 전부를 읽어옴

2) 숫자 (문자 입력 시 오류)

nextInt( ); : 정수

nextFloat( ); : 실수   

nextDouble( ); : 실수

 

 

 

 

 

 

 

 

간단하게 사용자의 정보(이름, 나이, 키)를 입력받고, 그 정보를 출력하는 프로그램을 만들어보자

 

---->> 사용자가 입력한 값을 메모리 공간에 기입을 해야 하는데, 

외부장치(키보드나 마우스 등)에서 입력을 하면 입력 버퍼라는 곳에 먼저 들어오게 된다.

 

       [ 홍길동 입력 => 입력 버퍼 공간에 들어감 => String 통해서 메모리 안에 name이라는 변수 생성

                 => 홍길동이라는 입력값은 메모리 안에 있는 name 변수 속으로 입력됨. ]

 

이때, String은 변수에 입력 후 엔터를 지우지만, int, double 등은 지우지 않고 남겨놓는다. 

이로 인해 문제가 발생하는 경우를 밑에 코드에서 보도록 하자

 

이번에는 이름과 나이 주소 그리고 키를 입력받는 프로그램을 만든다고 가정하자

 

주소는 입력하지도 못한 채, 키의 입력으로 넘어가게 된다. 그 이유는 주소위의 나이 nextInt가 enter을 지우지 않았기에 발생하는 문제이다. 

nextLine버퍼에서 값을 가져온 후 '엔터를' 비워주는 역할을 수행 그 외의 next___ () 메소드 들: 버퍼에서 값을 가져오고 바로 끝냄 (입력버퍼안 enter를 비워주지않음)

따져보자면 이런 형태기에, sc.nextInt 후에 sc.nextLine 메소드가 호출된다면 버퍼에 남아 있는 엔터 때문에 sc.nextLine이 바로 실행되어버린다.

 

**해결방법

버퍼에 남아있는 '엔터'를 비워주기 

즉, sc.nextLine( ); 한번 더 호출해주기.

 

 

응용 2))) 입력값으로 아래의 문장 출력하기 

" ㅇㅇ님은 ㅇ살이며, 사는 곳은 ㅇㅇㅇ이고, 키는 ㅇㅇcm입니다. "

 

응용 3))) 

 

 * ㅇㅇㅇ님의 개인정보
 * 성별 : x
 * 나이 : xx
 * 키 : xx cm

 

 

       nextChar라는 메소드는 존재하지 않는다.

       문자열이 아닌 문자를 입력하고 싶다면, 

       사용자가 입력한 값을 문자열로 가지고 온 후 내가 원하는 인덱스의 문자 값을 추출해서 담아야 한다.

       인덱스 추출 메소드 : charAt( _ );

       문자열 가지고 오기 : sc. nextLine( ) + 인덱스 charAt( ); = sc.nextLine( ),charAt( );

 

       * 인덱스 => 모든 문자열에는 인덱스가 존재한다,

         예를 들어 문자열 "apple" 은 문자 'a' 'p' 'p' 'l' 'e'의 합. 여기서 a는 0번째 인덱스이다. (e는 4)

 

       성별은 "여자" "남자"에서 첫 번째 문자를 추출하면 되므로 charAt( 괄호 안에 숫자는 0이다 );

 

 

추출 완료!

댓글