티스토리 뷰
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() 메서드는 공백을 구분해 입력을 받는다. '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() 메서드를 호출하는 방법이 현명할 것이다.
'JAVA > JAVA Theory' 카테고리의 다른 글
[JAVA] 12. Array(배열) (0) | 2019.11.16 |
---|---|
[JAVA] 11. Java.lang.Math.random() & Java.util.Random (0) | 2019.11.16 |
[JAVA] 9. [제어문][반복문(Loop문)] For문 (0) | 2019.11.13 |
[JAVA] 8. [제어문][반복문(Loop문)] While문 (0) | 2019.11.13 |
[JAVA] 7. [제어문][조건문] switch문 (0) | 2019.11.13 |
- Total
- Today
- Yesterday
- model
- java 환경설정
- 추상화
- jdbc
- Oracle
- select
- Delete
- JdbcTemplate
- ojdbc6.jar
- 객체
- 다형성
- 상속
- 캡슐화
- controller
- .
- 객체지향
- JDBC 프로그램 작성단계
- INSERT
- Update
- java
- Scott/Tiger
- MVC
- OOP
- view
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |