티스토리 뷰

JAVA/JAVA Theory

[JAVA] 10. Java.util.Scanner

쟌쥰 2019. 11. 13. 20:04

Scanner 클래스 : java.util 패키지의 Scanner 클래스를 이용하면 콘솔로부터 정수, 실수, 문자열 을 읽어 올 수 있다.

Scanner 객체를 생성하려면 다음과 같이 import를 통해 외부 클래스를 호출하고, 생성자에 System.in 파라미터를 전달하면 된다.

import java.util.Scanner;
Scanner sc = new Scanner(System.in);

Scanner 메서드들은 콘솔에서 데이터를 입력한 후 Enter키를 누르면 동작하도록 되어 있다.

다음 코드를 통해 Scanner의 사용법에 대한 예시를 살펴보겠다.

package com.test01;

import java.util.Scanner;

public class ScannerTest01 {

	public static void main(String[] args) {
		//test01();
		test02();
	}
	
	//next() 메서드를 통해 int 타입의 변수를 입력받아 합을 출력!
	public static void test01() {
		Scanner sc = new Scanner(System.in);
		System.out.println("숫자를 입력해 주세요 : ");
		int a = sc.nextInt();
		
		System.out.println("또 입력해 주세요 : ");
		int b = sc.nextInt();
		
		System.out.println(a + b);
	}
	
	//next() 와 nextLine() 의 차이점
	public static void test02() {
		Scanner sc = new Scanner(System.in);
		
		//next() : 공백을 구분해 하나만 출력 input : a b c  -> output : a
		String str = sc.next();
		System.out.println(str);
		
		//sc.next()에서 입력받은 나머지를 한번 처리해 주고 다시 nextLine()을 사용해야함
		sc.nextLine();	//이 부분을 주석처리 했을 때와 아닐 때의 차이점을 집중하자
		
		String str2 = sc.nextLine();
		System.out.println(str2);
	}
}

next() 에서 공백을 구분해 입력받은 나머지를 처리하지 않았을 때
next() 에서 공백을 구분해 입력받은 나머지를 처리했을 때

next() : next() 메서드는 공백을 구분해 입력을 받는다. 'a b c' 처럼 공백이 포함된 문자를 입력했을 때 next() 메서드는 a만 리턴시키고 나머지 ' b c' + 'Enter'는 그대로 남겨 놓는다.

nextLine() : nextLine() 메서드는 Enter값을 넣기 전까지 공백을 포함한 문자열을 리턴한다.

 

next() 메서드와 nextLine() 메서드를 혼용할 때 생길 수 있는 치명적인 문제점은 위의 코드와 같다. next() 메서드 사용시 사용자의 입력에 따라 공백이 포함된 문자열을 입력할 경우 첫 공백 이전의 문자만을 리턴하고, 다음 위치한 nextLine() 메서드는 남아있는 문자열과 enter 값을 리턴한다. 즉 next() nextLIne() 두 메서드를 실행했지만 실제 사용자는 입력을 한번밖에 할 수 없다.

 

이를 해결하기 위한 방법은 next() 메서드와 nextLIne() 메서드 사이에 nextLine() 메서드를 한번 서 실행시켜서 남아있는 문자열을 처리한 후 사용자의 입력을 받는 것이다.

 

sc.close();

Scanner 의 메모리 할당을 해제하는 close() 메서드에 대한 주의점도 살펴 보자.

package com.test01;

import java.util.Scanner;

public class ScannerTest02 {

	public static void main(String[] args) {
		test01();
		test02();
	}

	private static void test02() {
		// 콘솔창에 입력한 숫자의 단만 출력하자.

		Scanner sc = new Scanner(System.in);

		System.out.println("구구단에서 원하는 단을 입력해 주세요 : ");
		int i = sc.nextInt();

		System.out.println("<" + i + " 단>");
		for (int j = 1; j <= 9; j++) {
			System.out.println(i + " * " + j + " = " + i * j);
		}

	}

	private static void test01() {
		Scanner sc = new Scanner(System.in);

		System.out.println("성을 입력해 주세요 : ");
		String lastName = sc.nextLine();

		System.out.println("이름을 입력해 주세요 : ");
		String firstName = sc.next();

		System.out.println("안녕하세요, " + lastName + firstName + "님. ");

		System.out.println(sc.next());

		//sc.close();	
		//test02에서 다시 scan 할 때 오류!! 
		//Scanner sc = new Scanner(System.in) 을 전역변수로 선언해서 프로그램이 모두 끝나고 close() 하는게 좋음
	}
}

 코드의 test01() 메서드에서 sc.close()를 주석해제해 실행할 경우 test02 에서 scan오류가 발생하는 것을 확인할 수 있다.

각 메서드에서 Scanner 객체를 생성하고 close() 하기 보다는 Scanner객체를 전역변수로 선언해 모든 프로그램이 끝난 후 close() 메서드를 호출하는 방법이 현명할 것이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함