[Java 입출력] 고성능 입출력과 디버깅 테크닉
Scanner보다 빠른 입출력 방식과 효율적인 디버깅 방법을 설명합니다. - BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
고성능 입출력 처리
INPUT
BufferedReader, StringTokenizer
사용
-
System.in
으로 입력을InputStreamReader
로 받아서BufferedReader
에 담는다. -
br.readLine()
를" "
기준으로 잘라서StringTokenizer
에 담는다. (split 처럼) -
만약 입력의 끝나는 부분을 알고싶다면???
-
br.readLine()==null
로 알 수 있으며, 테스트는 Ctrl+D 를 입력하면 된다. -
테스트케이스(입력)가 몇개인지 모를 때 예시 코드
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //테케가 몇개인지 모를 때 while(true) { String t = br.readLine(); if ( t==null || t.length()==0 ) break; //풀이... }
-
-
파입 입출력을
System.in
으로 사용 가능하게 설정도 가능!System.setIn(new FileInputStream("input.txt"));
- 이후
System.in
사용하면 됨.
OUTPUT
StringBuilder
사용
-
System.out.println
도 많이쓰지만, 많은 출력 땐StringBuilder
를 권장 -
sb.setLength(0);
-> 초기화 하기 -
sb.setLength(sb.length()-2);
-> 끝에 2칸 지우기
예제코드
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] arr = new int[301][301];
public static void main(String[] args) throws IOException {
// 1. 입력!!
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine()," ");
int n = Integer.parseInt(stk.nextToken());
int m = Integer.parseInt(stk.nextToken());
// 그 다음 부터 n(행)번 입력 받기 (m은 열)
for (int i = 0; i < n; i++) {
stk = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < m; j++) {
arr[i][j] = Integer.parseInt(stk.nextToken());
}
}
// 2. 출력!!
StringBuilder sb = new StringBuilder();
sb.append("n : " + n + ", m : " + m).append('\n');
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
sb.append(arr[i][j]);
}
sb.append('\n');
}
System.out.println(sb);
}
}
디버깅 테크닉
💡 디버깅 팁(이클립스)
- 단축키
- F8: 브레이크포인트 이동
- F6: 함수 단위 이동
- F5: 한 줄씩 이동
- if문 넣어서 원하는 곳으로 한번에 이동(브레이크 포인트 함께 사용)
- 보고싶은 변수 드래그하면 한번에 볼 수 있음
배열 출력
배열 출력 추천 메소드
// 1차원 배열
System.out.println(Arrays.toString(arr));
// 2차원 배열
for(int i = 0; i < n; i++) {
System.out.println(Arrays.toString(arr[i]));
}
// 범위 지정 출력
System.out.println(Arrays.toString(Arrays.copyOfRange(arr, 0, 5)));
객체 디버깅
toString 오버라이딩으로 객체 내용 보기 간편
class Node {
int x, y;
@Override
public String toString() {
return "Node[x=" + x + ", y=" + y + "]";
}
}
//print로 객체 출력 시 자동으로 toString() 메서드 반환값이 출력 됨
효율적인 입출력 처리와 디버깅 기법을 활용하면 개발 생산성을 크게 향상시킬 수 있습니다.
댓글남기기