1️⃣ 입력
1. Scanner 클래스
📌 특징
- java.util.Scanner를 사용하여 편리하게 입력을 받을 수 있음
- 공백과 개행을 기준으로 값을 쉽게 분리 가능
- System.in을 사용하므로 입력 속도가 느림 (큰 입력에는 비효율적)
📌 장단점
장점
- 사용법이 간단함
- 정수, 실수, 문자열 등 다양한 타입 지원
단점
- 입력 속도가 느림
- nextLine() 사용 시 개행 문제 발생 가능
📌 주요 메서드
메서드 | 설명 |
nextInt() | 정수 입력 |
nextLong() | long 입력 |
nextDouble() | 실수 입력 |
next() | 공백 기준으로 문자열 입력 |
nextLine() | 한 줄 입력 |
hasNext() | 입력이 남아 있는지 확인 |
📌 예제
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
double b = sc.nextDouble();
sc.nextLine(); // 개행 문자 제거
String s = sc.nextLine();
System.out.println("입력: " + a + ", " + b + ", " + s);
}
}
⚠️ 주의할 점
- nextInt(), nextDouble() 등을 사용한 후 nextLine()을 호출할 경우, 개행 문자 문제가 발생할 수 있음 → sc.nextLine()을 한 번 호출하여 개행 문자 제거
- Scanner는 내부적으로 System.in을 닫으므로 명시적으로 close()를 호출하지 않아도 동작 가능
- 하지만 File을 읽을 때는 close()를 호출해야 자원 해제됨.
2. BufferedReader + InputStreamReader
📌 특징
- System.in을 버퍼를 통해 읽어들여 속도가 매우 빠름
- readLine()을 사용해 한 줄 단위로 입력을 받음
- 기본적으로 문자열(String) 로 입력받기 때문에, 숫자로 변환이 필요함
📌 장단점
장점
- 입력 속도가 빠름
- 대량의 입력 처리에 유리
단점
- 입력값을 직접 파싱해야 함
- readLine()은 문자열만 반환
📌 주요 메서드
메서드 | 설명 |
readLine() | 한 줄 입력 |
close() | 스트림 종료 |
📌 예제
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine()); // 정수 입력
System.out.println("입력된 숫자: " + num);
br.close();
}
}
⚠️ 주의할 점
- 숫자 입력 시 Integer.parseInt()를 사용해야 함
- br.close()로 스트림을 닫아야 함
- 필수는 아니지만, 권장됨 (자원 해제 목적)
- BufferedReader는 파일을 읽거나 네트워크에서 데이터를 받을 때 자원을 점유하므로, 사용 후 close()를 호출하는 것이 좋음.
- 하지만 단순 콘솔 입력(System.in)에서는 close()를 생략해도 문제 없음.
3. StringTokenizer
📌 특징
- StringTokenizer는 문자열을 공백(또는 특정 구분자) 기준으로 나누는 도구이기 때문에, 단독으로 입력을 받을 수 없고 반드시 문자열을 입력받은 후 사용해야 함 → BufferedReader + StringTokenizer 조합으로 보통 많이 사용
- 공백으로 구분된 여러 개의 입력을 쉽게 처리할 수 있음
- BufferedReader와 함께 사용하여 빠른 입력 가능
📌 장단점
장점
- nextToken()으로 간편하게 값 분리
- BufferedReader와 함께 사용하면 매우 빠름
단점
- 직접 문자열을 넘겨줘야 함
- 특정 구분자 이외의 처리는 어려움
📌 주요 메서드
메서드 | 설명 |
nextToken() | 다음 토큰 반환 |
hasMoreTokens() | 남은 토큰이 있는지 확인 |
📌 예제
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println("입력된 값: " + a + ", " + b);
br.close();
}
}
⚠️ 주의할 점
- BufferedReader.readLine()으로 먼저 한 줄을 입력받아야 함
- StringTokenizer는 단독으로 사용할 수 없음
- Scanner와 함께 사용 가능하지만 비효율적
- Scanner는 공백 단위로 자동으로 입력을 처리할 수 있기 때문에, 굳이 StringTokenizer를 사용할 필요가 없다. → 차라리 sc.nextInt() 등을 쓰는 게 더 직관적
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringTokenizer st = new StringTokenizer(sc.nextLine()); // 한 줄 입력 후 사용
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println("입력된 값: " + a + ", " + b);
sc.close();
}
}
2️⃣ 출력
1. System.out
📌 특징
- print(), println(), printf() 등을 사용하여 출력
- 가장 간단한 출력 방법이지만, 속도는 느린 편
📌 장단점
장점
- 사용이 간편함
- 다양한 포맷 지원 (printf())
단점
- 출력 속도가 상대적으로 느림
- 많은 데이터 출력 시 비효율적
📌 주요 메서드
메서드 | 설명 |
print() | 개행 없이 출력 |
println() | 출력 후 개행 |
printf() | 형식 지정 출력 |
📌 예제
System.out.print("Hello ");
System.out.println("World!");
System.out.printf("정수: %d, 실수: %.2f\\n", 10, 3.14);
2. BufferedWriter + OutputStreamWriter
📌 특징
- BufferedWriter는 System.out보다 출력 속도가 빠름
- flush()를 호출해야 출력됨
📌 장단점
장점
- 출력 속도가 빠름
단점
- flush()를 명시적으로 호출해야 함
📌 주요 메서드
메서드 | 설명 |
write(String s) | 문자열 출력 |
newLine() | 개행 추가 |
flush() | 버퍼 비우기 |
📌 예제
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("Hello, World!");
bw.newLine();
bw.flush();
bw.close();
}
}
⚠️ 주의할 점
- flush()를 명시적으로 호출해야 함
- BufferedWriter는 버퍼를 이용해 출력 데이터를 한 번에 처리하므로, 즉시 반영되지 않음.
- 따라서 출력 전에 반드시 flush()를 호출해야 함.
- 출력 후 바로 프로그램이 종료되면 자동으로 flush() 되지만, 명시적으로 호출하는 것이 안전함.
3️⃣ 상황별 추천 입출력 방식
입력
- 간단한 입력 → Scanner
- 대량의 입력 처리 → BufferedReader + StringTokenizer
- 숫자 여러 개 입력 → BufferedReader + StringTokenizer
- 문자열 여러 줄 입력 → BufferedReader
출력
- 간단한 출력 → System.out.println()
- 다량 출력 → BufferedWriter