백준 11286번과 함께 배우는 Java Heap & 빠른 입력 처리

no-glass-otacku·2025년 4월 2일
0

Java 코딩 공부 중 새롭게 배운 개념 정리

📌 관련 백준 문제: 백준 11286번 - 절댓값 힙

1️⃣ throws IOException을 왜 넣었을까?

  • 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);
    }
}

2️⃣ BufferedReader와 InputStreamReader의 차이, 그리고 왜 같이 써야 할까?

  • InputStreamReader: 바이트 스트림을 문자 스트림으로 변환하는 클래스.
  • BufferedReader: 문자 입력 스트림을 더 효율적으로 처리하기 위한 버퍼링 기능 제공.
  • 왜 같이 써야 할까?
    • System.in은 기본적으로 바이트 기반 스트림이므로, 이를 문자 스트림으로 변환하려면 InputStreamReader가 필요함.
    • BufferedReader는 한 번에 여러 문자를 읽어와서 성능을 향상시킴.
    • 즉, BufferedReader가 입력을 빠르게 처리하기 위해 InputStreamReader를 감싸서 사용함.
    • 만약 BufferedReader 없이 InputStreamReader만 사용하면 한 글자씩 읽어야 하므로 속도가 느려지고, readLine()을 사용할 때 문자열이 깨질 위험이 있음.

📌 예제 (빠른 입력 처리)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
  • Scanner보다 빠르게 입력을 받을 수 있음.

3️⃣ readLine()은 무슨 메서드일까?

  • 한 줄 단위로 입력을 읽는 메서드.
  • BufferedReaderreadLine()을 사용하면 공백을 포함한 전체 문자열을 읽을 수 있음.
  • 입력이 없으면 null을 반환함.

📌 예제

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
System.out.println("입력된 값: " + input);

4️⃣ Comparator의 역할과 사용하는 방법

  • Comparator는 객체 정렬 기준을 정의하는 인터페이스.
  • 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))를 사용할 때, xInteger 타입이라고 확실하게 명시해 줘야 함.
  • <Integer>를 생략하면 x의 타입을 추론하는 과정에서 Object로 간주될 수 있어 Math.abs(Object)를 찾을 수 없다는 에러가 발생함.
  • 따라서 명시적으로 <Integer>를 지정하면 올바르게 동작함.

5️⃣ int 변수에 null을 넣을 수 없는 이유

  • int기본형(primitive type) 데이터라서 null을 가질 수 없음.
  • 대신 Integer(참조형 클래스)를 사용하면 null을 저장 가능.

📌 예제

Integer num = null; // 가능
int num2 = null; // 오류 발생!

💡 해결 방법: Integer를 사용하거나, OptionalInt를 활용.


6️⃣ Queue vs PriorityQueue의 차이

  • QueueFIFO(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️⃣ BufferedReaderInputStreamReader를 같이 사용하는 이유는 빠른 입력 처리를 위해서이며, InputStreamReader 없이 사용하면 문자열이 깨질 위험이 있음.
3️⃣ readLine()은 한 줄씩 입력을 읽을 때 사용하는 메서드임.
4️⃣ Comparator를 사용할 때 <Integer>를 명시적으로 지정하지 않으면 Object로 간주되어 에러가 발생할 수 있음.
5️⃣ intnull을 가질 수 없고, 대신 Integer를 사용해야 함.
6️⃣ Queue는 선입선출(FIFO)이고, PriorityQueue는 우선순위가 높은 요소부터 처리됨.

profile
Move forward

0개의 댓글