백준에서 문제를 푸는데 System.out.println(), Scanner가 너무 느려서 글을 작성하게 되었다(┬┬﹏┬┬)
BufferedReader
사용 상황
대량의 문자열 입력을 빠르게 처리해야 할 때 유용하다.
주요 메서드
read(): 입력 스트림에서 한 번에 하나의 문자를 읽는다. 읽은 문자의 유니코드 값을 int 타입으로 반환하고 더 이상 읽을 문자가 없으면 -1을 반환한다.
readLine(): 입력 스트림에서 한 줄의 문자열을 읽어 반환한다. 읽은 문자열을 반환하고 더 이상 읽을 줄이 없으면 null을 반환한다.
skip(long n): 입력 스트림에서 n개의 문자를 건너뛴다. 실제로 건너뛴 문자의 수를 반환하고 n보다 적은 수의 문자를 건너뛴 경우, 건너뛴 문자의 수를 반환한다.
mark(int readAheadLimit): 현재 위치를 마크한다. readAheadLimit는 마크된 위치에서 읽을 수 있는 최대 문자 수를 지정한다.
reset(): 마크된 위치로 스트림을 되돌린다.
close(): 스트림을 닫는다.
사용 예시
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderExample {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("문자열을 입력하세요: ");
String input = reader.readLine();
System.out.println("입력한 문자열: " + input);
reader.close();
}
}
문자열을 다른 데이터 형식으로 변환
readLine()을 사용하는 경우 사용자가 입력한 데이터는 항상 String 형식으로 반환된다. 따라서, 만약 사용자가 입력한 값을 다른 데이터 형식으로 사용하고 싶다면, 형 변환을 수행해야 한다. 아래는 형 변환을 포함한 예시 코드이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderExample {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("정수를 입력하세요: ");
String input = reader.readLine();
int number = Integer.parseInt(input);
System.out.println("입력한 정수: " + number);
reader.close();
}
}
BufferedWriter
사용 상황
대량의 문자열 출력을 빠르게 처리해야 할 때 사용된다.
주요 메서드
write(String str): 문자열을 출력한다.
write(char[] cbuf, int off, int len): 문자 배열의 일부를 출력한다.
newLine(): 줄 바꿈을 추가한다.
flush(): 버퍼의 내용을 강제로 출력한다.
close(): 스트림을 닫는다.
사용 예시
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterExample {
public static void main(String[] args) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
writer.write("👻");
writer.newLine();
writer.write("👽");
writer.flush();
writer.close();
}
}
StringTokenizer
사용 상황
문자열을 특정 구분자를 기준으로 분리해야 할 때 사용된다.
주요 메서드
StringTokenizer(String str): 주어진 문자열을 공백을 기준으로 토큰으로 분리한다.
StringTokenizer(String str, String delim): 주어진 구분자를 사용하여 문자열을 토큰으로 분리한다.
hasMoreTokens(): 더 많은 토큰이 있는지 확인한다.
nextToken(): 다음 토큰을 반환한다.
countTokens(): 남아 있는 토큰의 수를 반환한다.
사용 예시
import java.util.StringTokenizer;
public class StringTokenizerExample {
public static void main(String[] args) {
String str = "💩,👽,👻";
StringTokenizer tokenizer = new StringTokenizer(str, ",");
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
}
}
StringBuilder
사용 상황
여러 개의 문자열을 자주 수정, 추가, 삭제해야 할 때 StringBuilder를 사용하면 성능이 향상된다.
주요 메서드
append(String str): 문자열을 추가한다.
append(char c): 문자를 추가한다.
insert(int offset, String str): 지정한 위치에 문자열을 삽입한다.
delete(int start, int end): 지정한 범위의 문자열을 삭제한다.
reverse(): 문자열을 반전시킨다.
toString(): 객체를 출력할 때 자동으로 호출되는 메서드로 최종 문자열을 반환한다.
capacity(): 현재의 용량을 반환한다.
length(): 현재 문자열의 길이를 반환한다.
사용 예시
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(", ");
sb.append("World!");
System.out.println(sb.toString()); //Hello, World!
}
}
Scanner
그래도 Scanner 사용법은 알아야 할 것 같아서 Scanner도 정리한다=.=
사용 상황
사용자로부터 입력을 받을 때 유용하며, 다양한 데이터 타입을 쉽게 읽어올 수 있다.
주요 메서드
next(): 공백을 기준으로 다음 단어를 읽어온다. 즉, 입력된 문자열에서 첫 번째 공백까지의 부분만 반환한다.
nextLine(): 한 줄 전체를 읽어온다. 사용자가 입력한 내용이 줄 바꿈 문자(\n)에 도달할 때까지의 모든 문자열을 반환한다.
nextInt(): 입력 스트림에서 정수를 읽어 반환한다.
nextDouble(): 입력 스트림에서 실수를 읽어 반환한다.
hasNext(): 입력 스트림에 다음 토큰이 있는지 확인한다.
hasNextInt(): 입력 스트림에 다음 토큰이 정수인지 확인한다.
hasNextDouble(): 입력 스트림에 다음 토큰이 실수인지 확인한다.
close(): 스트림을 닫는다.
사용 예시
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("정수를 입력하세요: ");
int number = scanner.nextInt();
System.out.println("입력한 정수: " + number);
scanner.nextLine(); //버퍼 비우기
System.out.print("문자열을 입력하세요: ");
String text = scanner.nextLine();
System.out.println("입력한 문자열: " + text);
scanner.close();
}
}
문자열을 다른 데이터 형식으로 변환
Scanner는 BufferedReader와 다르게 쉽게 nextInt(), nextDouble() 메서드를 사용하여 입력된 문자열을 직접 해당 데이터 타입으로 변환할 수 있다. 예를 들어, nextInt()를 사용하면 입력된 정수를 바로 int 타입으로 받을 수 있다. 하지만 성능이 느리다는 단점이 있다.
버퍼를 비우는 이유와 방법
nextInt() 또는 nextDouble() 메서드를 호출한 후에는 입력 버퍼에 줄 바꿈 문자가 남아 있게 된다. 이로 인해 다음에nextLine()을 호출하면 남아 있는 줄 바꿈 문자를 읽게 되어 빈 문자열이 반환된다. 따라서, nextLine()을 한 번 더 호출하여 입력 버퍼를 비워야 한다. 이렇게 하면 줄 바꿈 문자를 소비하고, 이후에 사용자가 입력한 문자열을 정상적으로 읽을 수 있다.
'Language > JAVA' 카테고리의 다른 글
[JAVA]내부 반복자 vs 외부 반복자 (0) | 2025.02.05 |
---|---|
[JAVA]String 클래스 메소드 (0) | 2025.01.20 |
[JAVA]정규 표현식 (0) | 2025.01.14 |
[JAVA]Stack, Queue 컬렉션(Collection) (2) | 2024.12.25 |
[JAVA]List, Set, Map 컬렉션(Collection) (2) | 2024.11.24 |