주인장의 프로그래밍 개발 공부방

[자바 프로그래밍 기초] 3. Scanner 사용 방법 본문

Java/자바 프로그래밍 기초

[자바 프로그래밍 기초] 3. Scanner 사용 방법

거신 2019. 6. 11. 16:23

지난 시간에 입력에 대해서 간단히 알아봤었다.

그런데 이 녀석을 부르고 문을 닫는 방법만 알아봤지

실제로 코드 안에서 어떻게 쓰는지에 대해선 알아보지 않았다.

그래서 이번 시간에는 사용하는 방법과 동시에

응용하는 방법에 대해서 알아보도록 하자.

 

1. Scanner 사용 방법 기초

 

먼저 Scanner를 사용하기 위해선 Scanner를 불러와야한다는 건 알고 있을 것이다.

한 번 불러와보자.

 

예시)

Scanner sc = new Scanner(System.in);

sc.close();

 

이렇게 불러오면 우리는 Scanner를 사용할 준비가 완료한 것이다.

무조건 sc.close();를 써주고 그 사이에 빈 공간에 우리가 원하는 코드를 작성할 수 있도록 하자.

그렇다면 단순히 Scanner를 불러온 것만으로 끝났다면 좋겠지만

너무나 당연하게도 그렇지가 않다.

우리는 Scanner가 가지고 있는 여러 물건들을 사용하기 위해서

단순히 Scanner를 불러온 것 뿐이다.

이제 그 안에 있는 무궁무진한 것들을 꺼내서 사용해보도록 하자.

다양한 내용이 있겠지만

일단 프로그래밍 기초에서 많이 사용하는 녀석들을 중심으로 작성해보도록 하자.

 

1) 입력 명령어의 종류

 

Scanner는 한 가지의 장난감만 가지고 있는 것이 아니다.

어마어마하게 다양한 장난감을 가지고 있다.

심지어 변수의 타입별로 다른 장난감들을 가지고 있기 때문에

변수의 타입에 맞는 장난감들을 따로따로 들고와야할 필요가 있다.

장난감의 종류에는 다양하지만

우리가 자주 사용하는 것들을 중심으로 언급하자면 이렇게 있다.

 

1. next()

2. nextLine()

3. nextInt()

4. nextDouble()

 

이렇게 4가지를 가장 많이 사용한다.

그런데 눈에 띄는 부분이 있을 것이다.

바로 nextInt()nextDouble()이다.

Int와 Double이 있는 것으로 봐서 혹시 Float이나 Long도 있지 않을까하는

의심을 할 수 있을 것이다.

당연히 존재한다.

기본형 변수 7가지(char제외)가 모두 존재하고 있다.

하지만 여기에서는 우리가 가장 자주 사용하는 기본적인 것만 언급했기 때문에

일부러 언급하지 않았다.

하지만 사용법은 동일하니 이 후에 사용법에 맞춰서 원하는 것으로 변경만 하면 된다.

 

다시 본론으로 돌아와서 일단은 사용하는 방법부터 알아보자.

 

2) 코드에서 사용 방법

 

일단 코드 상에서 Scanner를 불러온 상태이고 변수명이 sc라고 하자.

 

그렇다면 이렇게 작성하고 프로그램을 실행하면

콘솔창에 커서가 깜빡깜빡할 것이다.

 

예시)

sc.nextLine();

 

그러면 커서에 I'm a student라고 입력하고 엔터를 치면 아무 일도 발생하지 않고

프로그램은 내가 입력한 문장만 남겨두고 종료될 것이다.

원래라면 콘솔창에선 커서는 깜빡이지만 입력같은 건 죽어도 되지 않았을 터인데

이상하게 내가 입력이 가능하게 되었다.

이게 바로 Scanner의 힘이다.

 

그렇다면 도대체 이걸 가지고 어떻게 활용한다는 것일까?

우리가 만약 방금 입력한 I'm a student하나의 데이터로서 변수에 저장할 수 있다면 어떨까?

그러면 코드 안에서 입력한 값이 아니라

내가 콘솔창에서 내가 원하는 값을 입력해서 이걸 내 마음대로 주무를 수 있다는 뜻이 아닐까?

그렇다면 그건 또 어떻게 해야할까?

간단하다. 내가 입력받은 값을 변수에 그대로 집어넣어주면 된다.

일단 예시를 완성 시켜보자면 이러한 코드로 완성이 된다.

 

예시)

String str = new String();

str = sc.nextLine();

System.out.println(str);

 

이렇게 작성을 하고 콘솔창에 다시 I'm a student를 입력하고 엔터를 치면

내가 입력한 I'm a student와

그 바로 다음 줄에 I'm a student가 똑같이 출력될 것이다.

위의 출력된 것sc.nextLine()를 통해서 입력한 것이고

밑에 출력된 것System.out.println();을 통해서 출력된 것이다.

잘 보면 내가 입력한 문장이 참조변수 str에 저장된다는 것을 알 수 있다.

 

그렇기 때문에 위의 예시처럼 작성하게 되면

내가 적은 문장을 하나의 변수에 저장할 수 있고

그 변수를 가지고 프로그램 안에서 사용할 수 있는 것이다.

만약 숫자를 입력받는다면 우리는 이 값들로 선택지를 구현한다든지

여러 다양한 프로그램들을 만들 수 있는 것이다.

자유도가 엄청 높아지는 것이다.

그렇다면 그냥 위의 예시처럼 쓰면 아무 문제없이 동작하는 것일까?

그렇다면 정말 좋겠지만 여기에도 몇가지 규칙이 있으니 찬찬히 살펴보도록 하자.

 

3) Scanner 작성 규칙

 

여기부터는 Scanner를 사용하는데 있어서 지켜야할 규칙들에 대해서 알아보도록 하자.

이렇게 작성하지 않으면 에러가 주구장창 발생하니까

에러가 발생한다면 하나씩 돌이켜보며 생각해볼 필요도 있을 것이다.

 

먼저 Scanner의 종류이다.

앞서 4가지의 Scanner의 종류를 알아봤는데

괜히 구분을 지어놓은 것이 아니다.

다 이유가 있는 것이다.

앞서 언급한 4가지와 더불어 기본형을 모두 포함하여 설명하겠다.

 

next() - String타입

nextLine() - String타입

nextByte() - byte타입

nextShort() - short타입

nextInt() - int타입

nextLong() - long타입

nextFloat() - float타입

nextDouble() - double타입

nextboolean() - boolean타입

 

현재 작성한 내용들은 Scanner가 입력받을 수 있는 타입들을 작성한 것이다.

예를 들면 nextInt()는 int형의 정수만 입력이 가능하고

nextDouble()은 당연히 실수형을 입력받을 수 있다.

그런데 이렇게 봤을 때 2가지의 의문이 들 수 있다.

바로 char타입이 없는 것과 그 것과 반대로 String타입이 2개씩이나 존재하고 있는 것이다.

일단 먼저 말하자면 char타입을 입력받는 Scanner는 존재하지 않는다.

무조건 String타입인 문자열로만 입력을 받을 수 있는 것이다.

대신 입력받은 문자열을 가지고 char로 변환해주는 것도 있으니 나중에 기회가 되면 알아보도록 하자.

 

그리고 또 한가지 의문인 것은 바로 String타입이 2개나 존재하고 있다는 것이다.

next()nextLine()이 그 주인공인데

도대체 왜 같은 타입이 2개씩이나 존재하는 것일까?

당연히 이유가 존재한다.

먼저 next()는 우리가 문자열을 입력한다면

컴퓨터가 입력한 문자열의 끝을 2가지로 판단한다.

바로 띄어쓰기와 엔터(줄바꿈)다.

그리고 nextLine()띄어쓰기를 문자열에 포함하고 엔터(줄바꿈)만 문자열의 끝으로 인식한다.

예를 들면

만약 우리가 이러한 문자열을 입력한다고 생각해보자.

 

I'm a student

 

Scanner를 사용해서 위의 문자열을 입력했을 때

만약 next()로 입력을 받아서 변수에 저장했다면 결과물은 I'm 만 저장된다.

반대로 nextLine()을 이용했다면 결과물은 I'm a student 전체를 저장할 수 있는 것이다.

분명한 차이가 있으니 꼭 기억하길 바란다.

 

그리고 앞서 타입을 언급한 이유는 당연히 해당 Scanner로 입력을 받아서

변수에 저장하려면 동일한 타입의 변수를 선언해줘야 하는 것이다.

예시를 보자.

 

예시)

String str = sc.next();

int a = sc.nextInt();

double b = 0.0;

b = sc.nextDouble();

 

이렇게 변수에 저장을 하겠다면 무조건 동일한 타입에 저장을 해야한다.

여기에서 

 

b = sc.nextInt();

str = sc.nextDouble();과 같이 작성하면

타입이 동일하지 않다는 에러가 발생하게 되니 꼭 주의하길 바란다.

 

4) Scanner 작성 응용

 

보통 Scanner를 많이 사용하는 경우는 이러한 모습이 많을 것이다.

 

예시)

숫자를 입력하세요 : 3

번호를 선택하세요 : 5

 

등과 같은 경우가 생길 것이다.

이럴 경우 저 안내문 뒤에 우리가 숫자를 입력하고

그 숫자에 따라서 프로그램이 동작하게 만드는 것이 주요하다.

그래서 보통은 Scanner는 위와 같이 안내문과 함께 작성하는 것이 일반적이다.

위의 예시를 구현하면 다음과 같다.

 

예시 코드)

Scanner sc = new Scanner(System.in);
int a = 0;
int b = 0;

System.out.print("숫자를 입력하세요. : ");
a = sc.nextInt();

System.out.print("번호를 선택하세요. : ");
b = sc.nextInt();

sc.close();//꼭 먼저 쓰는 버릇을 들이자.

 

이렇게 작성하면 위의 예시처럼 콘솔창에 띄우고 입력할 수 있게 된다.

만약 저기에서 print가 아니라 println으로 작성하면

결과가

 

숫자를 입력하세요 :

3

 

이런 형태로 바뀌게 되니 상황에 맞게 본인이 선택해서 사용하면 되겠다.

그리고 아래와 같이 작성하면 연속으로 입력을 받을 수 있으니

이런 식으로도 응용을 해보길 바란다.

 

예시)

Scanner sc = new Scanner(System.in);
int a = 0;
int b = 0;
int c = 0;

System.out.print("숫자 3개를 입력하세요. : ");
a = sc.nextInt();
b = sc.nextInt();
c = sc.nextInt();

sc.close();

 

이렇게 작성하고 콘솔창에서 띄어쓰기를 이용해 3 5 7로 입력하면

차례대로 변수 a, b, c에 3, 5, 7이 저장된다.

물론 엔터를 사용해

3

5

7

로 입력해도 결과는 동일하다.

 

5) 주의점

 

마지막으로 주의점이다.

의외로 이 부분에서 실수하는 사람이 꽤나 있을 것이기 때문에 한 번은 언급해야 한다고 생각한다.

예시의 코드에서 빨간색으로 강조한 부분은 무조건 대문자이다.

이는 무조건 지켜야하는 부분이기 때문에 꼭 주의해서 작성하길 바란다.

 

예시)

Scanner sc = new Scanner(System.in);

String str = sc.nextLine();

int a = sc.nextInt();

double b = sc.nextDouble();

sc.close();

 

그리고 사용할 Scanner의 타입과 저장할 변수의 타입, 내가 직접 입력할 데이터의 타입은

항상 통일 시켜야 한다는 점도 잊지말자.

Comments