작성자 | 이재영 |
일 시 | 2024. 9. 24 (화) 18:00 ~ 21:00 |
장 소 | 복지관 b128-1호 |
참가자 명단 | 임혜진, 이재영, 성창민, 김명원, 장원준 |
사 진 | ![]() |
목차
- Scanner
- BufferedReader
- 다양한 입력 예제
지난 주차에 백준을 풀 때 느꼈던 기본기 부족을 위해 이번 주차는 입력을 주제로 스터디를 진행할 것이다. 주제를 입력으로 한 이유는 백준 문제를 풀면서 입력을 일단 잘 받아야 하는데, 시간초과가 뜨거나 행렬을 입력받거나, 한줄로 입력된 숫자를 하나 씩 입력받거나 하는 등에 입력을 원래 주 언어였던 파이썬으로 했을 때와 난이도 차이가 심해 공부가 필요하겠다고 느껴서기 때문이다.
1. Scanner
자바를 공부하면 가장 먼저 배우는 입력 방식이다. 자바에서 사용자로부터 콘솔 입력을 읽을 수 있는 간단한 방법을 제공하는 클래스이다. 문자, 문자열, 정수, 실수, boolean 등 다양한 형태의 데이터를 입력받을 수 있다.
Scanner의 주요 특징은 다음과 같다.
- 다양한 데이터 타입 지원 : nextInt(), nextLine(), nextDouble() 등 다양한 메서드를 제공하여 다양한 데이터 타입을 손쉽게 입력받을 수 있다.
- 줄 단위 입력 : nextLine() 메서드는 한 줄 전체를 입력받는 데 사용된다. 여러 단어를 포함한 긴 문자열을 처리할 때 유용하다.
- 공백을 기준으로 구분 : Scanner는 기본적으로 공백(스페이스, 탭, 엔터)을 기준으로 입력을 분리한다. 예를 들어, next() 메서드는 공백으로 구분된 첫 번째 토큰을 반환한다.
- 파일 및 기타 입력 소스 처리 : Scanner는 콘솔 입력뿐만 아니라 파일, 문자열, 네트워크 소켓 등 다양한 입력 소스를 처리할 수 있다.
사용법
Scanner를 사용하려면 일단 패키지를 하나 import 해야한다.
import java.util.Scanner;
이렇게 import를 한 이후, 객체를 생성한다. 양식은 이러하다. Scanner 객체명 = new Scanner(System.in);
Scanner scanner = new Scanner(System.in);
객체까지 생성했으면 사용할 준비는 끝났다. 그리고 이 객체를 사용하면 다양한 타입의 데이터를 받을 수 있는데, 그 메소드의 종류는 다음과 같다.
메서드명 | 설명 |
nextInt() | 정수를 입력받는다. |
nextFloat() | 실수를 입력받는다. |
nextDouble() | 큰 크기의 실수를 입력받는다. |
nextBoolean() | Bool 값을 입력받는다. |
nextLine() | 문자 또는 엔터를 치기 전까지의 문장 전체를 입력받는다. |
next() | 공백을 기준으로 한 단어 또는 한 문자씩 입력받는다. |
2. BufferedReader
자바에서 입력을 효율적으로 처리할 수 있게 도와주는 클래스이다. 주로 파일이나 콘솔에서 텍스트 데이터를 읽어오는 데 사용되며, 대량의 입력을 버퍼링하여 성능을 최적화하며, 한 번에 한 줄씩 입력을 읽을 수 있어 대용량 데이터를 처리할 때 유리하다.
BufferedReader의 주요 특징은 다음과 같다.
- 버퍼링된 입력 : BufferedReader는 입력을 버퍼링하여 성능을 향상시킨다. 즉, 데이터를 한 번에 읽고, 읽은 데이터를 메모리에 저장하여 필요한 만큼 처리하는 방식으로, 입력이 발생할 때마다 직접 데이터를 읽는 방식보다 빠르다.
- 줄 단위 입력 : BufferedReader는 주로 readLine() 메서드를 통해 한 줄씩 입력을 읽는다. 이 방법은 텍스트 기반 입력을 다룰 때 유용하다.
- 다양한 입력 소스 : BufferedReader는 파일, 콘솔, 문자열 등 다양한 입력 소스에서 데이터를 읽을 수 있다.
- IOException 처리 : BufferedReader를 사용할 때는 입출력 예외가 발생할 가능성이 있기 때문에 반드시 예외 처리가 필요하다.
사용법
BufferedReader를 사용하기 위해서는 3개의 패키지를 import 해야한다.
import java.io.BufferedReader; // 입력 스트림에서 데이터를 효율적으로 읽기 위해 버퍼링을 제공하는 클래스입니다.
import java.io.IOException; // 입출력 작업 중에 발생하는 예외를 처리하는 데 사용됩니다.
import java.io.InputStreamReader; // 바이트 스트림을 문자 스트림으로 변환해 주는 클래스입니다.
다음엔 Scanner와 마찬가지로 객체를 선언해준다.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
이렇게 객체까지 생성했으면 사용할 준비는 끝났다. 주로 사용하는 메서드들은 다음과 같다.
메서드명 | 설명 |
readLine() | 입력 스트림에서 한 줄을 읽어온다. 줄바꿈 문자를 만나면 그 전까지의 문자열을 반한한다. |
read() | 입력 스트림에서 하나의 문자를 읽는다. 반환되는 값은 문자의 정수형 유니코드 값이다. |
ready() | 입력 스트림에서 읽을 수 있는 데이터가 있는지 확인하고, bool 값을 리턴한다. |
close() | BufferedReader가 사용하는 스트림을 닫고, 자원을 해제한다. |
3. 다양한 입력 예제
3-1) 기본적인 입력
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // Scanner 객체 생성
// 문자열 입력
System.out.print("문자열 입력 : ");
String str = scanner.nextLine(); // 한 줄 전체 입력
// 정수 입력
System.out.print("정수 입력 : ");
int num = scanner.nextInt(); // 정수 입력
// 실수 입력
System.out.print("실수 입력 : ");
double dou = scanner.nextDouble(); // 실수 입력
// 결과 출력
System.out.println("문자열: " + str + ", 정수: " + num + ", 실수: " + dou);
scanner.close(); // 리소스 해제
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("문자열를 입력하세요: ");
String charCode = reader.readLine(); // 한 문자를 읽음
System.out.println("입력한 문자열: " + charCode);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3-2) 한 줄에 여러 정수 입력
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a, b;
a = sc.nextInt();
b = sc.nextInt();
System.out.printf("%d %d", a, b);
}
}
이렇게 코드를 작성하면 정수를 한 줄에 사용해도, 엔터키를 입력해도 잘 받아진다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
String input = reader.readLine();
// 공백 기준으로 문자열을 나누고, 각각을 정수로 변환
String[] tokens = input.split(" ");
int[] numbers = new int[tokens.length];
for(int i = 0; i < tokens.length; i++){
numbers[i] = Integer.parseInt(tokens[i]); // 문자열을 정수로 변환
}
// 정수 배열 출력
for (int num : numbers) {
System.out.println(num);
}
} catch (IOException e){
e.printStackTrace();
}
}
}
코드가 조금 더 길어지긴 했지만 원래 BufferedReader는 문자를 받기 위한 방법이기 때문에 문자로 입력을 받고, 그것을 정수로 형변환 시켜주는 방식으로 해야한다. 정수를 한줄에 하나만 받으려면 int a = Integer.parseInt(reader.readLine(); 이렇게 받으면 된다.
3-3) 입력한 정수에 따른 배열 입력
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a;
a = sc.nextInt();
int[] arr = new int[a];
for(int i = 0; i < a; i++){
arr[i] = sc.nextInt();
}
for(int i = 0; i < a; i++){
System.out.print(arr[i] + " ");
}
}
}
3-4) 한줄에 띄어쓰기 없이 입력된 정수 하나 씩 저장(2차원 배열)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
int n = Integer.parseInt(reader.readLine());
int m = Integer.parseInt(reader.readLine());
int[][] list = new int[n][m];
// 문자열로 받아 그 문자열을 한글자 씩 떼어 리스트에 넣어준다.
for(int i=0;i<n;i++){
String line = reader.readLine();
for(int j=0;j<m;j++){
list[i][j] = line.charAt(j)-'0';
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
System.out.print(list[i][j]+" ");
}
System.out.println();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
이렇게 오늘은 자바에서 많이 사용하는 입력의 종류에 대해서 알아보고 직접 사용해보았다. 다음 주차에는 출력의 방법을 좀 더 상세히 스터디해 보고자 한다.