์ฌ๋ฌ๋ถ๋ค ์ ๋ ฅ๋๊ตฌ Scanner ๋ง์ด ์ฐ์์ฃ ?
๊ทธ๋ฐ๋ฐ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ํ๋ค ๋ณด๋ฉด Scanner๋ณด๋ค BufferedReader / BufferedWriter์ ๋ ๋ง์ด ์ฐ๊ฒ ๋ฉ๋๋ค.
๋ฒํผ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ ์ด ๋ ์ข์๊น์?
๋ฒํผ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ ๋ ฅ์, ํค๋ณด๋์ ์ ๋ ฅ์ด ํค๋ฅผ ๋๋ฅด๋ ์ฆ์ ๋ฐ๋ก ํ๋ก๊ทธ๋จ์ ์ ๋ฌ
๋ฐ๋ฉด ๋ฒํผ๋ฅผ ์ฌ์ฉํ๋ ์ ๋ ฅ์, ํค๋ณด๋์ ์ ๋ ฅ์ด ์์ ๋๋ง๋ค ํ ๋ฌธ์์ฉ ๋ฒํผ๋ก ์ ์กํ๋ค.
๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ๊ฑฐ๋ ๊ฐํ ๋ฌธ์๊ฐ ๋ํ๋๋ฉด ๋ฒํผ์ ๋ด์ฉ์ ํ ๋ฒ์ ํ๋ก๊ทธ๋จ์ ์ ๋ฌ
์ฆ, ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ชจ์์ ์ ๋ฌ
Scanner๋ ๋ฐ์ดํฐ๋ฅผ ํ ํฐ ๋จ์๋ก ์ฒ๋ฆฌํ๊ณ ๋์ด์ฐ๊ธฐ์ ๊ฐํ๋ฌธ์๋ฅผ ๊ฒฝ๊ณ๋ก ํ์ฌ ์ ๋ ฅ ๊ฐ์ ์ธ์
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๊ฐ๊ณตํ ํ์๊ฐ ์์ด ํธ๋ฆฌํ๋ค.
BufferedReader์ ์ ๋ ฅ ๋ฐ์ ๋ฐ์ดํฐ๊ฐ String์ผ๋ก ๊ณ ์ ๋๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํ์ ์ผ๋ก ๊ฐ๊ณตํ๋ ์์ ์ด ํ์ํจ.
- Scanner๋ ๊ธฐ๋ณธํ ๋ฐ์ดํฐ ํ์ (์ ์, ์ค์ ๋ฑ)์ ์ ๋ ฅ๋ฐ์ ๋ ํธ๋ฆฌ (์ ๋ ฅ์ด ๋จ์ํ๊ณ ๋ถํ ์ด ํ์ํ ๊ฒฝ์ฐ)
- BufferedReader๋ ๋๋์ ํ ์คํธ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๊ฑฐ๋, ๋ผ์ธ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ์ ํฉ,์๋๊ฐ ์ค์ํ ๊ฒฝ์ฐ์ ๊ถ์ฅ
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ 2741๋ฒ ๋ฌธ์ ๋ฅผ Scanner์ BufferedReader๋ก ์ฝ๋ฉ์ Scanner(696ms) / BufferedReader(192ms)
- Buffer์์ readLine()์ ์ฐ๋ฉด ํ ์ค ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ ๊ณต๋ฐฑ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํด์๋ StringTokenizer ๊ฐ์ฒด๋
String์ split ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํจ
Scanner์ Buffer ์๋ ์ฐจ์ด๋ฅผ ๋น๊ต ํ๊ณ ์ถ์ผ๋ฉด ์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ ใฑใฑ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class InputSpeedTest {
public static void main(String[] args) throws IOException {
// ํ
์คํธ ํ์ ์ค์
int numIterations = 100000;
// Scanner๋ก ์
๋ ฅ ํ
์คํธ
long startTime = System.nanoTime();
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < numIterations; i++) {
int number = Integer.parseInt(scanner.nextLine());
}
scanner.close();
long endTime = System.nanoTime();
System.out.println("Scanner time: " + (endTime - startTime) + " ns");
// BufferedReader๋ก ์
๋ ฅ ํ
์คํธ
startTime = System.nanoTime();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < numIterations; i++) {
int number = Integer.parseInt(reader.readLine());
}
reader.close();
endTime = System.nanoTime();
System.out.println("BufferedReader time: " +
(endTime - startTime) + " ns");
}
}
- BufferedReader ์ฌ์ฉ๋ฒ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // ์ ์ธ
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
br.close()
์ ์ธํ ํ ์ ๋ ฅ์ readLine();์ด๋ผ๋ ๋ฉ์๋๋ก ํ๋ค.
๋จผ์ , ์ ๋ ฅํ์ ๋ณํ์ด ํ์ํ๋ค. BufferedReader๋ readLine()๋ฉ์๋๋ฅผ ํตํด ๋ฌธ์์ด(String)๋ง ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ซ์ ๋ฑ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์ง์ ํ๋ณํํด์ผ ํจ. ์๋ฅผ ๋ค์ด, ์ ์๋ฅผ ์ฝ์ผ๋ ค๋ฉด Interger.parseInt(br.readLine()) ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฌธ์์ด์ ์ ์๋ก ๋ณํํด ์ฃผ์ด์ผ ํจ.
๊ทธ๋ฆฌ๊ณ , ์์ธ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋์ ํ์๋ก ํ๋ค. BufferedReader์ ๋ฉ์๋๋ค์ IOException์ ๋ฐ์์ํฌ ์ ์์. ๊ทธ๋์ readLine()์ ๋ง๋ค try/catch ๋ธ๋ก์ผ๋ก ๊ฐ์ธ์ฃผ์ด๋ ๋๊ณ , main ๋ฉ์๋์ throws IOException(์ผ๋ฐ์ ) ์ ์ถ๊ฐํ์ฌ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด ์ฃผ์ด๋ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ ๋ ฅ ์ข ๋ฃ์ ์์ ํด์ ๋ฅผ ํด ์ฃผ์ด์ผ ํ๋ค. close() ๋ฉ์๋ ํธ์ถํด ์ฃผ๋๋ฐ ๋ณดํต br.close()๋ฅผ ํ๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋๋ฐ ๋์์ด ๋๋ค. ใ ใ
- ๋ฐ์ดํฐ ๊ฐ๊ณต ํ ๋ ์ฐ๋ StringTokenizer, split()
BufferedReader๋ฅผ ํตํด ์ฝ์ด์จ ๋ฐ์ดํฐ๋ ๊ฐํ๋ฌธ์ ๋จ์(Line ๋จ์)๋ก ๋๋์ด์ง๋ค.
๋ง์ฝ ์ด๋ฅผ ๊ณต๋ฐฑ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ณ ์ ํ๋ฉด ๋ฐ๋ก ์์ ์ ํด์ฃผ์ด์ผ ํ๋ค.
์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด StringTokenizer๋ String.split() ํจ์์ด๋ค.
StringTokenizer๋ ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ํ ํฐํํด์ฃผ๋ฉฐ, split()์ ์ ๊ท ํํ์์ ์ฌ์ฉํด ๋ฌธ์์ด์ ๋ถ๋ฆฌํ๋ค.
StringTokenizer์ nextToken() ํจ์๋ฅผ ์ฐ๋ฉด readLine()์ ํตํด ์ ๋ ฅ ๋ฐ์ ๊ฐ์ ๊ณต๋ฐฑ ๋จ์๋ก ๊ตฌ๋ถํ์ฌ ์์๋๋ก ํธ์ถํ ์ ์๋ค.
String.split() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ฐฐ์ด์ ๊ณต๋ฐฑ๋จ์๋ก ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ ๊ฒ๋ง ๋งํ๋ฉด ๋ฌด์จ ๋ป์ธ์ง ์ดํดํ๊ธฐ ํ๋๋๊น ์ฝ๋๋ฅผ ๋ณด์.
BufferedReader๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๋ก๋ถํฐ ํ ์ค๋ก ๋ "Hello World Java"๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋๋์ด ๊ฐ ๋จ์ด๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ๋ณด์.
1. ์ ๋ ฅ ๋ฐ๊ธฐ:
BufferedReader๋ฅผ ํตํด ์ฌ์ฉ์๋ก๋ถํฐ ๋ฌธ์์ด์ ์ ๋ ฅ๋ฐ์
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ "Hello World Java"๋ฅผ ์ ๋ ฅํ๋ฉด ์ด ๋ฌธ์์ด์ด input ๋ณ์์ ์ ์ฅ๋จ
2. ๊ณต๋ฐฑ์ผ๋ก ๋ฌธ์์ด ๋ถ๋ฆฌ:
StringTokenizer ๋๋ String.split(" ") ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ๋ ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ ,
๊ฐ ๋จ์ด๋ฅผ ํ ํฐ์ด๋ ๋ฐฐ์ด๋ก ๋ง๋ค๊ธฐ
3. ๋จ์ด ์ถ๋ ฅ:๋๋์ด์ง ๊ฐ ๋จ์ด๋ฅผ ๋ฐ๋ณต๋ฌธ์ ํตํด ์ถ๋ ฅ
"Hello", "World", "Java" ์ถ๋ ฅ๋จ
StringTokenizer ์ฌ์ฉํ ์ฝ๋
๊ณต๋ฐฑ์ ๊ธฐ๋ณธ ๊ตฌ๋ถ์๋ก ์ฌ์ฉํ์ฌ ์ ๋ ฅ๋ ๋ฌธ์์ด์ ๋จ์ด ๋จ์๋ก ๋๋
hasMoreTokens() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๋ ์ด์ ํ ํฐ์ด ์์ ๋๊น์ง ์ถ๋ ฅ ๋ฐ๋ณต
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Example {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine(); // ์: "Hello World Java"
StringTokenizer st = new StringTokenizer(input); // ๊ธฐ๋ณธ ๊ตฌ๋ถ์: ๊ณต๋ฐฑ
while (st.hasMoreTokens()) {
String word = st.nextToken();
System.out.println(word);
}
br.close();
}
}
String.split() ์ฌ์ฉํ ์ฝ๋
split(" ") ๋ฉ์๋๋ ์
๋ ฅ๋ ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋๋์ด ๋ฐฐ์ด ํํ๋ก ๋ฐํ.
์ด ๋ฐฐ์ด์ ํตํด ๊ฐ ๋จ์ด์ ์ ๊ทผ
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Example {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine(); // ์: "Hello World Java"
String[] words = input.split(" "); // ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด ๋ถ๋ฆฌ
for (String word : words) {
System.out.println(word);
}
br.close();
}
}
- BufferedReader์ ์จ์ ๋ฐฑ์ค2751๋ฒ ๋ฌธ์ ๋ฅผ ํ์ด ๋ณด์
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < N; i++) {
list.add(Integer.parseInt(br.readLine()));
}
Collections.sort(list);
for(int value : list) {
sb.append(value).append('\n');
}
System.out.println(sb);
}
}
BufferedReader๋ฅผ ์ฌ์ฉํด ํ์ค ์ ๋ ฅ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ,
StringBuilder๋ฅผ ์ด์ฉํด ์ถ๋ ฅ ํ์์ ์กฐํฉํ ๋ค ์ต์ข ์ ์ผ๋ก ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ๋ฐฉ์
1. BufferedReader ๊ฐ์ฒด ์์ฑ:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader๋ InputStreamReader(System.in)์ ๊ฐ์ธ๊ณ ์์ด ์ฝ์ ์ ๋ ฅ์ ๋น ๋ฅด๊ฒ ์ฝ์ ์ ์๋๋ก ํจ.
readLine() ๋ฉ์๋๋ฅผ ํตํด ํ ์ค์ฉ ๋ฌธ์์ด ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ด.
2. StringBuilder ๊ฐ์ฒด ์์ฑ:
StringBuilder sb = new StringBuilder();
StringBuilder๋ ์ถ๋ ฅํ ๋ด์ฉ์ ํ๋์ ๋ฌธ์์ด๋ก ์กฐํฉํ๋ ๋ฐ ์ฌ์ฉ
๋ฐ๋ณตํด์ ๋ฌธ์์ด์ ์ฐ๊ฒฐํ ๋ + ์ฐ์ฐ์ ๋์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ๋์
3. ๋ฐ์ดํฐ ์ ๋ ฅ ๋ฐ๊ธฐ:
int N = Integer.parseInt(br.readLine());
4. ArrayList์ ๋ฐ์ดํฐ ์ ์ฅ:
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < N; i++) {
list.add(Integer.parseInt(br.readLine()));
}
์ ๋ ฅ๋ฐ์ N ๊ฐ์ ์ ์๋ฅผ ArrayList<Integer>์ ์ ์ฅ
๊ฐ ์ ๋ ฅ ์ค์ ์ฝ์ด์จ ํ Integer.parseInt()๋ก ์ ์ํ์ผ๋ก ๋ณํํ ๊ฐ์ list์ ์ถ๊ฐ
5. ์ ๋ ฌ & ๊ฐ ์ถ๋ ฅ
Collections.sort(list);
for(int value : list) {
sb.append(value).append('\n');
}
System.out.println(sb);
for-each๋ฌธ์ ์ฌ์ฉํด list์ ๊ฐ ๊ฐ์ StringBuilder ๊ฐ์ฒด์ ์ถ๊ฐ
๋ง์ง๋ง์๋ System.out.println(sb);์ ํตํด ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ์ ์ถ๋ ฅ
- BufferedWriter
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // ์ ์ธ
String str = "abcdef"; // ์ถ๋ ฅํ ๋ฌธ์์ด
bw.write(s); // ์ถ๋ ฅ
bw.newLine(); // ์ค๋ฐ๊ฟ
bw.flush(); // ๋จ์์๋ ๋ฐ์ดํฐ ๋ชจ๋ ์ถ๋ ฅ
bw.close();
์ผ๋ฐ์ ์ผ๋ก ์ถ๋ ฅ์ ํ ๋, System.out.println(""); ์ ์ฌ์ฉํ๋ค. ํ์ง๋ง ๋ง์ ์์ ์ถ๋ ฅ์ ํ ๋๋, ์ ๋ ฅ๊ณผ ๋์ผํ๊ฒ ๋ฒํผ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. BufferedWriter๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐผ์ ๋๋ flush()๊ฐ ํธ์ถ๋ ๋ ์ถ๋ ฅ ์ฅ์น(์: ํ์ผ)์ ๊ธฐ๋กํ๋ค. ์ด๋ก ์ธํด I/O ์์ ์ ํ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ค. ํนํ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ๋ ์ด์ ์ด ํฌ๋ค.
์ด ๋ ๊ฐํ์ฒ๋ฆฌ๋ฅผ ํด ์ค์ผ ํ๋๋ฐ
newLine() ๋๋ write("\n") ์ ์ฌ์ฉํ๋ค. BufferedWriter๋ System.out.println()๊ณผ ๋ฌ๋ฆฌ ์๋์ผ๋ก ๊ฐํ์ ์ฒ๋ฆฌํ์ง ์๋๋ค. ๋ฐ๋ผ์ ๊ฐ ์ถ๋ ฅ ํ์ ๊ฐํ์ ์ถ๊ฐํ๋ ค๋ฉด newLine() ๋ฉ์๋ ๋๋ write("\n")์ ์ฌ์ฉํด์ค์ผ ํ๋ค. ์ฌ๋ฌ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ๋๋ ๊ฐ ์ค์ ๋์ newLine()์ ์ถ๊ฐํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ณผ์ ์ด ๋๋ ํ์๋ ๋ฒํผ ๋น์ฐ๊ธฐ์ ์คํธ๋ฆผ ์ข ๋ฃ๋ฅผ ํด ์ฃผ์ด์ผ ํ๋ค.
flush(): ๋ฒํผ์ ๋จ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ถ๋ ฅ ์คํธ๋ฆผ์ผ๋ก ๋ณด๋ด๋ ๋ฉ์๋์. ์ฌ๋ฌ ๋ฒ ์ถ๋ ฅ์ ํด์ผ ํ ๊ฒฝ์ฐ flush()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํผ์ ๋ด์ฉ์ ์ถ๋ ฅํ ์ ์์. close()๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์์ ์ข ๋ฃํ๋ ๋ฉ์๋๋ก ํ ๋ฒ ๋ซ์ผ๋ฉด ๋ค์ BufferedWriter ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ค์ผ ํจ.
- String Builder
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b").append(" ");
sb.append("c").append("\n");