📌 관련 백준 문제: 백준 11286번 - 절댓값 힙
throws IOException은 파일 입출력이나 콘솔 입력을 다룰 때 발생할 수 있는 예외를 호출한 쪽에서 처리하도록 위임하는 역할을 함.BufferedReader.readLine()을 사용할 때 입력 중 예외가 발생할 가능성이 있기 때문에 예외 처리를 강제함.throws IOException을 붙이지 않으면 try-catch를 이용해 직접 예외를 처리해야 함.📌 예제
import java.io.*;
public class Example {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine(); // 입력을 한 줄 읽음
System.out.println("입력값: " + input);
}
}
InputStreamReader: 바이트 스트림을 문자 스트림으로 변환하는 클래스.BufferedReader: 문자 입력 스트림을 더 효율적으로 처리하기 위한 버퍼링 기능 제공.System.in은 기본적으로 바이트 기반 스트림이므로, 이를 문자 스트림으로 변환하려면 InputStreamReader가 필요함.BufferedReader는 한 번에 여러 문자를 읽어와서 성능을 향상시킴.BufferedReader가 입력을 빠르게 처리하기 위해 InputStreamReader를 감싸서 사용함.BufferedReader 없이 InputStreamReader만 사용하면 한 글자씩 읽어야 하므로 속도가 느려지고, readLine()을 사용할 때 문자열이 깨질 위험이 있음.📌 예제 (빠른 입력 처리)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
Scanner보다 빠르게 입력을 받을 수 있음.BufferedReader의 readLine()을 사용하면 공백을 포함한 전체 문자열을 읽을 수 있음.null을 반환함.📌 예제
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
System.out.println("입력된 값: " + input);
PriorityQueue, TreeSet, TreeMap 등의 정렬 기준을 커스터마이징할 때 사용함.Comparator.comparingInt(x -> 기준)을 활용하여 특정 기준으로 정렬 가능.📌 왜 <Integer>를 명시적으로 지정해야 할까?
PriorityQueue<Integer> AbsMinHeap = new PriorityQueue<>(
Comparator.<Integer>comparingInt(x -> Math.abs(x)).thenComparingInt(x -> x)
);
Comparator.comparingInt(x -> Math.abs(x))를 사용할 때, x가 Integer 타입이라고 확실하게 명시해 줘야 함.<Integer>를 생략하면 x의 타입을 추론하는 과정에서 Object로 간주될 수 있어 Math.abs(Object)를 찾을 수 없다는 에러가 발생함.<Integer>를 지정하면 올바르게 동작함.int는 기본형(primitive type) 데이터라서 null을 가질 수 없음.Integer(참조형 클래스)를 사용하면 null을 저장 가능.📌 예제
Integer num = null; // 가능
int num2 = null; // 오류 발생!
💡 해결 방법: Integer를 사용하거나, OptionalInt를 활용.
Queue는 FIFO(First-In-First-Out, 선입선출) 구조.PriorityQueue는 우선순위가 높은 요소가 먼저 처리되는 구조.Queue는 순서대로 요소를 저장하지만, PriorityQueue는 정렬 기준에 따라 요소가 정렬됨.📌 예제
Queue<Integer> queue = new LinkedList<>();
PriorityQueue<Integer> pq = new PriorityQueue<>();
queue.add(3); queue.add(1); queue.add(2); → 출력: 3 → 1 → 2 (입력 순서 유지)pq.add(3); pq.add(1); pq.add(2); → 출력: 1 → 2 → 3 (작은 값부터 정렬됨)1️⃣ throws IOException을 사용하는 이유는 입출력 예외를 호출한 메서드에서 처리하도록 위임하기 위해서임.
2️⃣ BufferedReader와 InputStreamReader를 같이 사용하는 이유는 빠른 입력 처리를 위해서이며, InputStreamReader 없이 사용하면 문자열이 깨질 위험이 있음.
3️⃣ readLine()은 한 줄씩 입력을 읽을 때 사용하는 메서드임.
4️⃣ Comparator를 사용할 때 <Integer>를 명시적으로 지정하지 않으면 Object로 간주되어 에러가 발생할 수 있음.
5️⃣ int는 null을 가질 수 없고, 대신 Integer를 사용해야 함.
6️⃣ Queue는 선입선출(FIFO)이고, PriorityQueue는 우선순위가 높은 요소부터 처리됨.