[Java] input값 받는 2가지 방법

신영진·2022년 11월 16일
1

BufferedReader vs. Scanner

1.BufferedReader

BufferedReader 클래스는 버퍼를 이용하는 대표적인 I/O(Input/Output) 클래스이다. (입력된 데이터를 바로 전달하는 것이 아닌, 버퍼에 저장해두었다가 전달하는 방법)

주로 라인 단위로 입력받는 경우에 사용되며 입력 받는 값을 라인(enter) 기준으로 받게된다.
그러므로 한 라인에 공백(space)으로 값이 나누어져 있는 경우에는 파싱이 필수적이다.
그리고 입력 받은 모든 값은 string 타입으로 인식하기 때문에 모두 타입변환을 해줘야 한다. 또 자체적으로 Execption처리를 하지 않기 때문에 throws Exception 또는 try catch를 사용하여 따로 처리를 해줘야 한다.

BufferedReader를 사용하는 이유?

  • Scanner보다 빠르다!
  • multithread 환경에서 실행해도 lock 을 걸어서 독립성 보장이 가능함

1. import

import java.io.BufferedReader;
import java.io.InputStreamReader;

먼저 두개의 import선언을 해야 BufferedReader를 사용 할 수 있다.

import java.io.IOException;

Exception 처리를 위해 위 import도 함께 선언하는 것이 좋다.

2. 객체생성

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

입력값을 받기 위해 BufferedReader에 대한 새로운 객체를 생성한다.

3. 입력 받기

String str = br.readLine();

BufferedReader의 readLine() 메소드를 통해 한 줄을 입력 받는다.
BufferedReader는 기본적으로 string타입으로 input을 받기 때문에 br.readline()으로 입력값을 받는다.

int num = Integer.parseInt(br.readLine());

하지만 integer타입을 받고 싶다면 Integer.parseInt()를 통해 string을 integer로 변환하여 사용 할 수 있다.

4. 공백을 기준으로 값 받기

BufferedReader는 줄을 기준으로 값을 입력받기 때문에 한 줄에 공백(space)을 기준으로 값을 받기 위해서는 StringTokenizer를 사용해야 한다.
StringTokenizer는 util패키지에 있기 때문에 다음과 같이 import를 하여 사용한다.

import java.util.*;

StringTokenizer st = new StringTokenizer(br.readLine());

StringTokenizer 클래스에 대한 객체를 새로 만들고 br.readLine()을 전달하여 BufferedReader를 통해 받은 입력을 전달한다.

그리고 nextToken()을 사용하여 공백을 기준으로 값을 읽는다.

String str = st.nextToken();

Integer의 경우:

int x = Integer.parseInt(st.nextToken());

5. StringTokenizer 연속해서 값 받기

hasMoreToken()을 이용하여 다음 토큰이 더 있는지 확인 할 수 있다.

예제:

while(st.hasMoreTokens())
		{
			System.out.print(" " + st.nextToken());
		}

⭐ BufferedReader 의 경우 close() 메소드를 명시해주지 않아도 Garbage Collector에 의해 BufferedReader 및 내부의 객체들이 자동으로 정리된다. 즉 BufferedReader의 경우, close()를 콜해주지 않아도 문제는 없다.

2. Scanner

Scanner를 사용하면 BufferedReader 보다는 처리속도가 느리지만 더 쉽게 입력값을 받을 수 있고 입력값의 가공 또한 조금 더 쉽다.
Scanner클래스는 공백(space)과 줄(enter) 모두 경계로 입력값을 인식한다.

1. import

import java.util.Scanner;

2. 객체생성

Scanner sc = new Scanner(System.in);

입력값을 받기 위해 Scanner에 대한 새로운 객체를 생성한다.

3. 입력값 받기

Scanner는 여러 타입으로 입력값을 받을 수 있고 또한 공백과 줄 단위로 값을 입력 받을 수 있기 때문에 이에 따른 여러 메소드들이 존재한다.

sc.nextLine(); // 입력된 값 한줄을 string타입으로 리턴
sc.next(); // 입력된 값을 공백을 기준으로 string타입으로 리턴
sc.nextInt(); // 입력된 값을 integer타입으로 리턴
sc.nextBoolean(); // 입력된 값을 boolean타입으로 리턴

위에 보이는 메소드 외에도 많은 메소드들이 존재한다.
nextBigDecimal(), nextBigInteger(), nextByte(), nextDouble(), nextLong(), nextShort() 등 여러 메소드들을 통해 원하는 타입으로 변환이 가능하다.

4. 연속해서 입력값 받기

sc.hasNextLine();
sc.hasNext();

위 두 메소드를 통해 Scanner가 더 읽어들일 Line혹은 값이 있는지를 체크하여 true/false를 리턴한다.

예제:

while (sc.hasNextLine()) {
            String str = scanner.nextLine();
            System.out.println(str);
        }

5. close()

Scanner를 다 쓴 후 sc.close()를 사용하여 Scanner를 close한다.

⭐ 현재 이 블로그에서는 System.in, 표준입출력만을 다루고 있다. 표준입출력의 경우에는 close를 해주지 않아도 크게 문제가 되지는 않지만 파일을 읽거나 네트워크에서 뭘 읽어온다면 close를 해주지 않는 것이 문제가 될 가능성이 높다. 그렇기 때문에 close()를 하는 습관을 들이는 것은 좋은 습관이다!

profile
자라나는 새싹🌱

0개의 댓글