"꾸준하고 완벽한 한 걸음"

Programming Language/Java 11

[Java] Java에서의 Heap과 Priority Queue(for Algorithm Guide)

목차Heap이란?Priority Queue란?패키지선언 예제주요 연산offer(element) / add(element)peek()poll()최대 힙(Max-Heap) 구현Comparator.reverseOrder() 또는 람다를 이용한 방법네거티브 트릭 (Numeric 데이터에 한정)복합 데이터의 정렬과 Comparator 구현Heap이란?완전 이진 트리(Complete Binary Tree) 형태의 자료구조로, 각 노드가 특정한 순서 조건을 만족한다. 💡완전 이진 트리 구조란?모든 레벨이 완전히 채워지며, 마지막 레벨은 왼쪽부터 순서대로 채워지는 구조정렬 조건최소 힙: 모든 부모 노드의 값 ≤ 자식 노드의 값최대 힙: 모든 부모 노드의 값 ≥ 자식 노드의 값주요 특징 및 시간복잡삽입 및 삭제: O(..

[Java] Java의 다양한 정렬 방법 1 : Primitive / Object

목차Primitive Array 정렬하기Object Array 정렬하기정리예제 코드Java에는 다양한 타입(Primitive / Object / Collections)의 배열이 존재할 수 있으며, 정렬하는 방식도 제각각입니다.이번 글에서는 Primitive / Object 배열을 정렬하는 방법에 대해 알아보겠습니다.1️⃣ Primitive Array 정렬하기Arrays.sort()는 원시 배열을 정렬할 수 있습니다. 기본적으로 오름차순 정렬이 되며, 내부적으로 Dual-Pivot Quicksort 알고리즘을 사용합니다SortPrimitiveArray.javaArrays.sort()를 사용해 Primitive Array를 정렬하는 방법은 다음과 같습니다.package pl.java.D250216;impor..

[Java] Primitive Array에 내림차순 정렬이 없는 이유

목차왜 원시 배열은 내림차순 정렬을 지원하지 않을까?원시 배열을 내림차순 정렬하는 방법정리예제 코드자바에서는 Arrays.sort() 를 사용해 원시(Primitive) 배열을 쉽게 정렬할 수 있습니다. 하지만 원시 타입 배열에 대해 내림차순 정렬은 지원되지 않습니다.이 글에서는 원시 배열에 내림차순 정렬이 지원되지 않는 이유와, 이를 해결할 수 있는 대안에 대해 알아보겠습니다.1️⃣ 왜 원시 배열은 내림차순 정렬을 지원하지 않을까?원시 배열은 기본적으로 객체가 아니기 때문에 Comparator를 사용할 수 없습니다.Arrays.sort()는 원시 타입 배열에 대해 Comparator를 지원하지 않으므로, 정렬 순서를 커스터마이즈할 수 없습니다. 반면, 객체 타입 배열(Integer[], Double[]..

Java에서 Primitive Array 정렬에 Dual-Pivot Quicksort를 선택한 이유

목차원시 배열과 객체 배열의 차이Dual-Pivot Quicksort란?원시 배열에서 Dual-Pivot Quicksort를 사용하는 이유정리Java는 원시 배열(primitive array)을 정렬할 때 Arrays.sort() 메서드를 사용하며, 이 메서드는 내부적으로 Dual-Pivot Quicksort를 사용합니다. 반면, 객체 배열(Object array)의 경우 Timsort를 사용합니다.이 글에서는 원시 배열 정렬에 Dual-Pivot Quicksort가 Timsort보다 선호되는 이유를 원시 배열의 구조와 알고리즘의 특성을 중심으로 설명하겠습니다.1️⃣ 원시 배열과 객체 배열의 차이Java에서 원시 배열과 객체 배열은 메모리 구조와 접근 방식에 차이가 있습니다.원시 배열데이터가 연속된 메모..

[Java] Java switch의 문자열 비교, 내부 원리와 성능 분석

목차switch에서 문자열을 비교하는 방법switch의 내부 동작 원리switch vs if-elseswitch 사용 시 주의사항정리예제 코드Java 7부터는 switch문에서 문자열(String)을 비교할 수 있습니다. 기존의 if-else에서 equals()를 사용하는 방식보다 더욱 깔끔하게 문자열을 비교할 수 있습니다.이번 글에서는 switch에서 문자열 비교 시, 내부적으로 어떻게 동작하는지 자세히 알아보겠습니다.1️⃣ switch에서 문자열을 비교하는 방법Java 7 이후에는 정수나 열거형 뿐 아니라 문자열도 switch문의 조건으로 사용할 수 있습니다. 이는 switch의 값과 case의 문자열을 String.equals 를 사용한 것처럼 비교하기 때문입니다.The switch statemen..

[Java] List.of()로 생성된 불변 리스트와 컬렉션 초기화

목차UnsupportedOperationException이란?List.of()를 사용한 컬렉션 초기화컬렉션 생성자의 동작 원리정리예제 코드Java 9부터 도입된 List.of()는 불변 리스트(Immutable List)를 생성하는 편리한 메서드입니다. 하지만 이 불변 리스트에 직접 요소를 추가하려고 하면 UnsupportedOperationException이 발생합니다. 그런 반면 List.of()로 생성된 불변 리스트를 컬렉션의 초기값으로 전달 후 컬렉션에 요소를 추가하면 예외가 발생하지 않습니다.이번 글에서는 List.of()로 생성된 불변 리스트와, 이를 컬렉션의 생성자로 전달할 때 내부적으로 어떻게 동작하는지 살펴보겠습니다.1️⃣ UnsupportedOperationException이란?Java..

[Java] 람다 표현식의 반환 타입 추론

목차예시 - Arrays.sort()와 Comparator 람다 표현식함수형 인터페이스 설계와 람다 표현식람다 표현식의 반환 타입 추론 과정정리예제 코드Java 8부터 도입된 람다 표현식은 간결한 코드 작성과 함수형 프로그래밍 패러다임을 지원합니다. 람다 표현식을 사용할 때 가장 큰 장점 중 하나는 **타입 추론(type inference)**으로, 메서드의 매개변수나 반환 타입을 일일이 명시할 필요가 없다는 점입니다.이번 글에서는 Comparator 인터페이스 예시와 직접 함수형 인터페이스를 설계하고, 어떻게 람다 표현식이 반환 타입을 추론하는지 자세히 알아보겠습니다.1️⃣ 예시 - Arrays.sort()와 Comparator 람다 표현식Java에서는 배열을 정렬할 때, Arrays.sort() 메서..

[Java] Java에서의 Thread와 Thread Pool

목차스레드(Thread)란?단일 / 멀티 스레드 작업 예시스레드 풀(Thread Pool)과 사용 예시정리예제 코드이 글에서는 Java에서의 스레드(Thread)와 스레드 풀(Thread Pool)의 개념을 이해하고, 이를 활용하여 프로그램의 성능을 최적화하는 방법을 알아봅니다.또한, 스레드를 무분별하게 생성 및 사용 시 성능 저하로 이어지며 이를 해결하고자 스레드 풀(Thread Pool)을 사용하여 스레드를 효율적으로 관리하는 방법을 소개합니다.1️⃣ 스레드(Thread)란?스레드는 프로그램 내에서 실행되는 하나의 작업 단위✅ 스레드의 특징CPU의 기본 실행 단위 (프로세스 안에서 개별적으로 실행됨)각 스레드는 독립 실행 (하나의 스레드가 멈춰도 다른 스레드는 계속 실행됨)멀티 스레드를 사용하면 프로..

[Java] effectively final

Java를 사용하다 보면 effectively final라는 개념을 접하게 됩니다. 특히 람다 표현식이나 익명 클래스와 같은 구문을 작성할 때, 이 용어가 중요한 역할을 합니다.이번 글에서는 effectively final에 대해 알아보도록 하겠습니다.1. effectively final이란?effectively final은 Java에서 한 번 초기화된 후로 값이 변경되지 않는 변수를 의미합니다.쉽게 말해, final 키워드가 없어도 사실상 final처럼 동작하는 변수입니다.int number = 10; // 초기화Runnable task = () -> System.out.println(number); // 람다에서 number 사용 가능위 코드에서 number는 한 번 초기화된 이후 변경되지 않았기 때..

[Java] Double.MIN_VALUE는 음수가 아니다.

Java의 Double.MIN_VALUE는 종종 오해를 불러일으키는 상수입니다. 이름만 보면 "가장 작은 값"이라는 의미로 해석되어, 음수를 떠올리기 쉽습니다. 하지만 Double.MIN_VALUE는 음수가 아니며, 오히려 0에 가까운 양수입니다. 이를 이해하기 위해 해당 상수의 의미와 사용하는 맥락을 살펴보겠습니다. 1. Double.MIN_VALUE 란?Double.MIN_VALUE는 Java에서 double 타입이 표현할 수 있는 가장 작은 양의 값을 의미합니다. 이는 IEEE 754 표준에 따라 정의된 부동소수점 방식에서 정규화된 가장 작은 값입니다.public class DoubleExample { public static void main(String[] args) { Sys..