본문 바로가기
Programming/JAVA

[JAVA] 입력할 때 Scanner, BufferedReader 차이와 메소드

by 안녕주 2023. 9. 5.

Scanner

  • 공백이나 구분 문자로 데이터를 분리하여 읽을 수 있다.
  • 다양한 자료형(정수, 실수, 문자열 등)의 데이터를 읽을 수 있다.
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
	}
}
sc.close();
파일을 읽거나 네트워크에서 읽어오거나 할 때는 꼭 사용해야 한다

 

Scanner의 메소드들

boolean hasNext() 스캐너의 입력에 다른 토큰이 있으면 true를 반환
boolean hasNextLine() 스캐너의 입력에 다른 줄(\n)이 있는지 확인 후, 있으면 true를 반환
String next() 이 스캐너에서 다음에 입력된 문자열 중 공백전까지 입력받은 토큰을 반환
String nextLine() \n(Enter) 전까지 입력받은 모든 토큰을 반환
int nextInt() 입력받은 int 타입 데이터를 반환

 

 

 

BufferedReader

BufferedReader 클래스는 버퍼링 기능을 활용하여 입출력 성능을 향상시킨다.

  •  java.io 패키지에 속해있다.
  • 버퍼링 기능으로 인해 입출력 작업이 빈번하게 발생할 때 성능 개선을 기대할 수 있다.
  • 파일이나 네트워크 소켓 등 다양한 소스로부터 데이터를 읽어올 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main1 {
	public static void main(String args[]) throws IOException {
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
        	//한 줄씩 String 형태로 받기 위해 readLine을 추가
            	//readLine을 추가하기 위해 StringTokenizer를 생성
		StringTokenizer st = new StringTokenizer(br.readLine());

		//StringTokenizer로 받은 값을 int형태로 파싱
		int b = Integer.parseInt(st.nextToken());

		br.close();
		
		System.out.println(b);
	}
 
}

 

readLine()

  • readLine() 메서드를 사용하여 한 줄 씩 문자열 형태로 데이터를 읽어올 수 있다. (Enter만 경계로 인식)
  • readLine()은 입력값으로 들어온 데이터를 한 줄로 읽어서 String으로 바꾸는 메소드다.

1. 리턴값을 String으로 고정되기에 다른타입으로 입력을 받을려면 형변환 필수

2. 예외처리 필요 - try & catch를 활용하거나 throws IOException사용

 

 

Enter 단위가 아닌 공백 단위로 데이터 가공하는법

1. StringTokenizer의 nextToken() 사용 하면 readLine()으로 받은 값을 공백단위로 구분가능

2. String.split()을 사용해 배열에 공백단위로 끊어서 데이터를 넣고 사용

StringTokenizer st = new StringTokenizer(s); //StringTokenizer에 입력 문자열 넣음
int a = Integer.parseInt(st.nextToken()); //첫번째 
int b = Integer.parseInt(st.nextToken()); //두번째 

String array[] = s.split(" "); //공백단위로 데이터 끊어서 배열에 넣음

 

 

StringTokenizer

StringTokenizer는 후가공을 위해 필요한 것이다.(BufferedReader와 필수로 같이 써야만 하는 줄 알았는데 공백 단위로 가공하기 위해 필요 했던것)

아래와 같이 StringTokenizer 없이 BufferedReader의 br.readLine()으로만 입력받을 수 있다. 

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

		int N = Integer.parseInt(br.readLine()); // readLine()으로 입력받은 String을 int로 변환
		int[] arr = new int[N];


		// 공백 단위로 다음줄을 읽기 위헤 StringTokenizer 사용
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		br.close();
	}

}

 

StringTokenizer의 메소드

countTokens() 토큰의 갯수를 리턴
nextToken() 기본 구분자(공백, 탭)을 기준으로 다음 토큰을 리턴한다. 이전 토큰은 제거
nextToken(String delim) 구획문자(delim)을 기준으로 리턴
hasMoreTokens() 리턴할 다음 토큰이 있으면 true, 없으면 false

 

- StringTokenizer 클래스 생성자의 2번째 인수로 구분자를 여러개 지정할 수 있다.

String str = "사과,배.복숭아,수박,멜론";

// 2개 이상의 구분자를 기준으로 정확하게 문자열이 나누기
StringTokenizer st = new StringTokenizer(str, ",.");

while(st.hasMoreTokens()){
	System.out.println(st.nextToken());
}

//출력 결과 
//사과
//배
//복숭아
//수박
//멜론

 

- StringTokenizer 클래스 생성자의 3번째 인수로 구분자를 토큰에 포함할지의 여부를 지정할 수 있다.

- 3번째 인수 생략시(false) 구분자는 토큰에 포함되지 않지만, 3번째 인수에 true를 입력하면 구분자도 토큰으로 취급한다.

StringTokenizer st = new StringTokenizer(str, "=,", true);

StringTokenizer st = new StringTokenizer(str, "=,"); //false 생략가능

 

 

 

참고

[Java 자바] 스캐너(Scanner) 정리 + 기본 사용법 (tistory.com)

[JAVA] Scanner vs BufferedReader : 입출력 처리 방법 비교하기 (tistory.com)

[JAVA] BufferedReader 와 Bufferedwriter 사용법 : 네이버 블로그 (naver.com)

BufferedReader와 BufferedWriter의 사용법 (JAVA) (tistory.com)

[JAVA 자바] StringTokenizer (tistory.com)

StringTokenizer, hasMoreTokens(), nextToken() (tistory.com)

 

 

댓글