본문 바로가기

Java

(13)
[Java] 배열(Array)과 컬렉션(Collection)의 정렬 방식 1️⃣ 배열(Array) 정렬배열은 java.util.Arrays 클래스의 정적 메서드 sort()를 이용해 정렬한다.기본적으로 오름차순 정렬이며, 내림차순 정렬 시에는 Comparator를 함께 사용해야 한다. 1. 기본 타입 배열 (int[], double[] 등)import java.util.Arrays;public class ArraySortExample { public static void main(String[] args) { int[] numbers = {5, 2, 9, 1, 7}; // 오름차순 Arrays.sort(numbers); // 내림차순 // 기본 타입 배열은 Comparator를 직접 적용할 수 없음 → 박싱 ..
[Java] List<Integer> ↔ int[] 변환 방법 1️⃣ List → int[] 변환 ✅ Java 8 이상 – Stream API 사용 (권장)List list = Arrays.asList(1, 2, 3, 4, 5);int[] arr = list.stream() .mapToInt(Integer::intValue) .toArray(); list.stream() → 스트림 생성.mapToInt(Integer::intValue) → Integer를 int로 언박싱.toArray() → 배열로 변환내부적으로 박싱/언박싱 연산이 포함되어 있어, 아주 큰 리스트에서는 미세한 오버헤드 존재 ✅ for문을 이용한 수동 변환List list = Arrays.asList(1, 2, 3, 4, 5);int[] arr =..
[Java] 주요 자료구조 클래스의 핵심 메서드 🧩 1. String (불변 객체)문자열을 다루는 클래스 (java.lang.String) length(): 문자열 길이 반환charAt(int index): 특정 인덱스 문자 반환indexOf(String s) / lastIndexOf(String s): 특정 문자(열) 위치 찾기substring(int begin, int end) / substring(int begin): 부분 문자열 추출 (begin ~ end-1 / begin ~ 끝까지)toLowerCase() / toUpperCase(): 대소문자 변환contains(String s): 포함 여부 확인startsWith() / endsWith(): 접두사, 접미사 검사split(String regex): 구분자로 분리해 String[] 반환r..
[Java] 진법 변환 (10진수 ↔ n진수) Java에서 진법 변환은 크게 두 가지 상황으로 나눌 수 있다.10진수 정수 → n진법 문자열 (int → String)n진법 문자열 → 10진수 정수 (String → int) 🧩 10진수 정수 → 다른 진법 문자열 (int → String)int num = 42;String binaryString = Integer.toBinaryString(num); // 101010 (2진수)String octalString = Integer.toOctalString(num); // 52 (8진수)String hexString = Integer.toHexString(num); // 2a (16진수)String string = Integer.toString(num, 3); // 112..
[Java] 자바의 예외 – 체크 예외 vs 언체크 예외 🧩 자바의 예외 계층 구조 자바의 예외(Exception)는 프로그램 실행 중 발생할 수 있는 오류를 나타내는 객체다.자바의 모든 예외는 Throwable 클래스를 상속받으며, 이는 다시 Error와 Exception으로 나뉜다.(✅: 체크 예외, ❌: 언체크 예외) Object | Throwable / \ Error ❌ Exception ✅ / \ ✅ RuntimeException ❌ \ ❌Error:OutOfMemoryError처럼 ..
[Java] 컬렉션 순회 중 발생하는 ConcurrentModificationException 🧩 개념발생 시점: 컬렉션(Collection)을 Iterator 또는 foreach(내부적으로 Iterator 사용)로 순회하는 도중, 해당 컬렉션의 구조적 변경(Structural Modification)이 감지되면 발생함구조적 변경(Structural Modification): 컬렉션의 크기나 구조에 영향을 주는 작업요소 추가/삭제, 내부 배열 크기 변경 등단순히 요소 값을 수정하는 것은 구조적 변경이 아님 🔎 발생 원리Java 컬렉션(ArrayList, HashMap 등)의 대부분은 fail-fast iterator를 사용함fail-fast iterator는 내부적으로 modCount라는 변경 횟수 카운터를 유지함컬렉션이 구조적으로 변경될 때마다 modCount 증가Iterator 생성 시점의..
[Java] >>(산술 시프트)와 >>>(논리 시프트)의 차이 (2의 보수와 오버플로우) 두 방식의 차이는 2의 보수 방식과 부호 비트를 이해하면 자연스럽게 알 수 있다. 자바의 정수는 "2의 보수 체계"를 사용한다.자바에서 int, long 같은 정수형 타입은 내부적으로 2의 보수 방식으로 음수를 표현한다.이는 컴퓨터가 음수를 표현하고 계산하기 위한 표준 이진수 체계다. 🤔 왜 2의 보수 방식을 쓰는가?음수 표현 방식 중 하나인 부호-절대값 방식(기호 비트 따로 두기)은 연산 회로가 복잡하다는 단점이 존재한다.반면, 2의 보수는 덧셈과 뺄셈을 동일한 방식으로 처리할 수 있어 연산이 단순하고, 하드웨어 구현도 쉽다는 장점이 존재한다. 🧮 2의 보수 만드는 방법2의 보수 = 1의 보수(비트 반전) + 1 예제: -5를 8비트 2의 보수로 표현5의 이진수: 000001011의 보수 (비트 ..
[Java] Arrays.binarySearch()와 Collections.binarySearch()의 차이 Java의 Arrays.binarySearch()와 Collections.binarySearch()는 이진 탐색(binary search) 알고리즘을 기반으로 하는 대표적인 메서드로, 정렬된 데이터에서 특정 값을 빠르게 탐색하는 데 사용된다. 하지만 자료형에서 오는 차이점이 존재한다. 🔍 공통점이진 탐색 기반으로, 시간 복잡도가 O(log N)이다.반드시 정렬된 상태의 배열/컬렉션에서만 정상적으로 동작한다.탐색 실패 시 음수 값을 반환한다.-(삽입될 위치) - 1 형태로 반환된다. ⚖️ 차이점항목Arrays.binarySearch()Collections.binarySearch()대상 자료형배열 (int[], Object[] 등)List (예: ArrayList)제네릭 지원제한적 (Object[]만 제네..
[Java] StringBuilder 메서드 정리 📌 StringBuilder에서 주로 사용하는 메서드 정리StringBuilder는 문자열을 수정할 수 있는 객체로, String보다 문자열 변경 작업에서 훨씬 효율적이다. 1️⃣ append(String s)문자열을 뒤에 추가한다.+ 연산자를 여러 번 사용할 경우보다 성능이 좋다.✅ 시간 복잡도: O(1) 🔹 예제StringBuilder sb = new StringBuilder("Hello");sb.append(" World!");System.out.println(sb); // "Hello World!" 2️⃣ insert(int index, String s)특정 위치에 문자열을 삽입한다.기존 문자는 뒤로 밀린다.✅ 시간 복잡도: O(N) 🔹 예제StringBuilder sb = new Strin..
[Java] BufferedWriter 기본적으로 자바에서 출력할 때는 System.out.println()으로도 충분하다. 하지만 출력할 일이 많을 때는 시간이 오래 걸린다.그럴 때 사용하기 좋은 것이 바로 BufferedWriter이다. 백준 15552번의 풀이를 예제로 보자.import java.io.*;import java.util.*;class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(S..
[Java] String 클래스의 substring() 메서드 String 클래스의 substring() 메서드에는 2가지의 종류가 있다. public String substring(int beginIndex) { return substring(beginIndex, length());} 지정된 인덱스의 문자부터 문자열의 끝까지 잘라낸다.예를 들어, "unhappy".substring(2)은 "happy"를 반환한다. public String substring(int beginIndex, int endIndex) { int length = length(); checkBoundsBeginEnd(beginIndex, endIndex, length); if (beginIndex == 0 && endIndex == length) { retu..
[Java] BufferedReader Scanner보다는 BufferedReader가 빠르기 때문에 BufferedReader를 사용해서 입력을 받아보자. 간단하게 백준 문제 1000번의 풀이를 예제로 보자.import java.io.*;import java.util.*;class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nex..
[Java] enum 타입의 ==(동일성 비교) vs equals(동등성 비교) 1. 동일성(Identity) 비교 동일성 비교는 == 연산자를 사용하는 것으로, 두 객체가 같은 메모리 주소를 참조하는지를 확인한다.자바에서 하나의 enum 상수는 클래스 로드 시 한 번만 생성되고, 해당 상수는 JVM 내에서 단일 인스턴스를 보장한다. (싱글톤)따라서 동일한 enum 값끼리는 항상 == 비교를 통해 동일성을 확인할 수 있다.public class Example { public enum Day { MONDAY, TUESDAY, WEDNESDAY } public static void main(String[] args) { Day day1 = Day.MONDAY; Day day2 = Day.MONDAY; // 동일성 비교 ..