Java 52

getOrDefault() vs computeIfAbsent()

Java 컬렉션을 사용하다 보면 한 번쯤 마주치는 두 메서드가 있다.getOrDefault(key, defaultValue)computeIfAbsent(key, mappingFunction)둘 다 “key가 없을 때 기본 값을 어떻게 처리할 것인가”라는 공통 목적을 가진 것처럼 보이지만,작동 방식도 완전히 다르고, 쓰이는 상황도 전혀 다르다. 1. getOrDefault() — “단순 조회 + 기본 반환” 역할V value = map.getOrDefault(key, defaultValue);✔ 동작 방식key가 존재하면 해당 value를 그대로 반환한다.key가 존재하지 않으면 defaultValue를 반환만 한다.Map 자체에는 아무 것도 추가되지 않는다.✔ 특징Map 수정 없음읽기(Read) 연산d..

IT/JAVA 21:05:36

ReentrantLock 락 제어

Java에서 멀티스레드 환경을 다루다 보면, 가장 먼저 떠올리는 동기화 방식은 synchronized이다.하지만 실무에서는 synchronized만으로 해결할 수 없는 더 세밀한 락 제어가 필요한 경우가 많고,이때 선택하게 되는 도구가 바로 ReentrantLock이다. 단순한 전역 락이 아니라 자원별 락이 필요하다.이때 사용할 수 있는 패턴 중 하나가 ConcurrentMap + ReentrantLock 기반의 동적 락 관리 기법이다. 1. ReentrantLock이란ReentrantLock은 Java의 java.util.concurrent.locks 패키지에서 제공하는 명시적 락(Explicit Lock)이다.synchronized가 자동으로 락을 걸고 해제하는 구조라면, ReentrantLock은 ..

IT/JAVA 20:41:41

Java 예외: RuntimeException

RuntimeExceptionJava에서는 프로그램 실행 중 나타나는 오류(exception or error)를 처리하기 위해 예외(Exception) 클래스를 제공한다.그중 RuntimeException은 “런타임 예외(Runtime Exception)”로 불리며,보통 예측 불가능한 프로그래밍 오류를 나타낼 때 사용된다. RuntimeException을 직접 사용하거나, 그 하위 클래스를 사용하는 것 => 이게 바로 흔히 말하는 “Unchecked Exception”이다. 반대로 RuntimeException을 상속하지 않는 예외들은 Checked Exception으로 분류된다. Checked Exception vs Unchecked Exception 차이 검사 시점컴파일 시점 — 예외 처리를 강제..

IT/JAVA 19:02:07

ConcurrentHashMap – 멀티스레드 환경에서 안전하게 Map 사용하기

Java에서 HashMap은 단일 스레드에서는 빠르게 작동하지만, 멀티스레드 환경에서는 안전하지 않다.여러 스레드가 동시에 put()이나 get()을 호출하면 데이터 손상, ConcurrentModificationException, 무한 루프 같은 심각한 문제가 발생할 수 있다. HashMap의 멀티스레드 한계Map map = new HashMap();스레드 간 동기화가 없기 때문에 동시 접근 시 데이터 충돌 가능성이 있다최악의 경우 Iterator 사용 중 ConcurrentModificationException이나 무한 루프도 일어난다. ConcurrentHashMap – 안전하고 빠른 멀티스레드 Map스레드 안전(Thread-safe): 여러 스레드가 동시에 접근해도 안전높은 병렬성: 내부적으로 버..

IT/JAVA 2025.07.24

[프로그래머스 64065] [Java] 튜플

1. 문자열 파싱: {{2},{2,1},{2,1,3},{2,1,3,4}} → [[2], [2,1], [2,1,3], [2,1,3,4]] 형태로 바꾸기2. 튜플 길이 순 정렬: 가장 짧은 배열부터 순서대로 3. LinkedHHashSet을 이용해 이미 포함된 원소는 제외하면서 추출📝 Solutionimport java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;import java.util.LinkedHashSet;import java.util.List;import java.util.Set;public class 카카오_튜플 { public int[] solution(String s) { /* {{}} 제거, ..

Java String 클래스

String 클래스의 메서드들을 계속 잊어버려 복습겸 다시 정리해보았다. 🔖String 클래스- Java에서 문자열을 다룰 때 가장 기본이 되는 클래스- String 클래스는 문자열 데이터를 다루기 위한 불변(Immutable) 객체이다 - 한 번 생성된 문자열은 변경할 수 없으며, 문자열을 수정하는 것처럼 보이는 작업은 모두 새로운 문자열 객체를 생성하는 방식으로 처리된다 👉🏼 실제로는 새로운 문자열 객체가 생성된다 String str = "hello";str = str + " world"; 불변성 (Immutable)문자열을 수정할 수 없으며, 수정 시 새로운 객체가 생성된다객체 생성 방식문자열 리터럴로 생성하거나, new String()으로 생성할 수 있다 문자열 상수 풀 (String Po..

IT/JAVA 2025.04.15

JMH (JMH 라이브러리를 활용한 Java 코드 성능테스트)

JMH 란?- Java Microbenchmark Harness- Java 공식 성능 측정 도구- OpenJDK 팀에서 만든 라이브러리로, 마이크로 벤치마크를 정밀하게 측정할 수 있게 도와준다.특징- JIT(Just-In-Time) 최적화 고려- 워밍업 시간, 반복 횟수 조정 가능- 평균/최댓값/표준편차 등 정밀 통계 제공- GC와 캐시 등 JVM 영향 최소화 ( 실행 환경 )Gradle 8.10.2Java 17VS CodeWindows 11 ✅ Gradle 프로젝트 생성 더보기VS Code 에서  단축키  Ctrl+Shift+PCreate Java Project 선택 Gradle 선택 Groovy 선택프로젝트명 입력   ✅ build.gradle 설정/* * This file was generated ..

IT/JAVA 2025.04.11

ArrayList vs LinkedList

|  컬렉션 프레임워크- 자바에서 데이터를 구조적으로 저장하고 관리학 위한 인터페이스 + 클래스 모음- 인터페이스로 기능을 정의하고  =>  클래스에서 구체적으로 구현한다  |  핵심 인터페이스 구조Map은 Collection을 상속하지 않는다 ※|  주요 인터페이스 + 대표 구현 클래스 ✅ List (순서 O, 중복 O)구현체특징ArrayList배열 기반, 인덱스 접근 빠름LinkedList노드 기반, 삽입/삭제 빠름VectorArrayList와 유사하지만 동기화됨StackVector 상속, LIFO 구조 ✅ Set (순서 X, 중복 X)구현체특징HashSet순서 없음, 빠름LinkedHashSet입력 순서 유지TreeSet자동 정렬 (Comparable or Comparator) ✅ Queue / D..

IT/JAVA 2025.04.08

코드 실행시간 비교

프로그래머스 문제를 풀다가 코드 실행 시간을 비교해 보고 싶었다.  📝  Java에서 성능 측정을 위한 헬퍼 클래스작업을 여러 번 실행하여 평균 실행 시간을 측정하고 결과를 출력제네릭을 사용하여 다양한 타입의 작업을 처리 package Java.helpers;public class BenchmarkHelper { /** * 작업을 여러 번 실행하여 평균 실행 시간 측정하고 결과를 출력한다. * @param name : 벤치마크 테스트 이름 * @param iteration : 작업 반복 횟수 * @param task : 벤치마크 테스트에서 실행할 작업 */ public static void runBenchmark (String name, int it..

IT/JAVA 2025.03.26

HashSet

HashSet 은 Set 인터페이스에서 지원하는 구현 클래스이다. => Set의 특징을 그대로 상속받는다. ✏️ Set- Java에서 중복을 허용하지 않는 컬렉션을 나타내는 인터페이스 - Key의 중복을 허용하지 않는다- Key로 null을 허용하지 않는다. - 중복을 자동으로 제거해준다.- 비선형 구조로 순서 없이 Key로만 데이터를 저장한다. => 인덱스X- 요소의 저장 순서를 유지해야 한다면 JDK1.4부터 제공하는 LinkedHashSet 클래스를 사용하면 된다.- 성능이 빠르고 검색 속도가 우수하다- 추가나 삭제시 Set 내부에 있는지 검색한 뒤 해야하므로 List구조에 비해 속도가 느리다  주요 구현 클래스HashSet :  가장 많이 사용되는 Set 구현체 (빠른 검색 속도, 순서X) Tre..

IT/JAVA 2025.03.20

[프로그래머스 12914] [Java] 멀리뛰기

짝수 홀수일는 나누고, 이진법 관련해서 푸는 문제인 줄 알았는데동적 계획법을 이용하는 문제였다...생각도 못했다.... 이전에 풀었던 피보나치 수 문제와 같은 것이었다... 2025.03.11 - [IT/JAVA] - [프로그래머스 12945] [Java] 피보나치 수>> 동적 프로그래밍 이용 ✏️ DP (Dynamic Programming) 동적 계획법- 복잡한 문제를 더 작은 하위 문" data-og-host="iamsh.tistory.com" data-og-source-url="https://iamsh.tistory.com/401" data-og-url="https://iamsh.tistory.com/401" data-og-image="https://scrap.kakaocdn.net/dn/k0PHP..

HashMap

HashMap- 자바의 컬렉션 프레임워크 중 하나로, 키와 값의 쌍으로 데이터를 저장하는 자료구조- 해시 테이블을 기반으로 하며, 키를 해시 함수로 해시 코드로 변환하여 값을 저장하고 검색한다- 키와 값의 쌍을 저장하며, 키는 중복될 수 없고, 값은 중복될 수 있다- 동일한 키로 값을 저장하면 기존 값이 덮어쓰여진다- 빠른 검색: 평균적으로 O(1)의 시간 복잡도로 데이터를 검색할 수 있다- 키(Key)값을 통해서만 검색 가능  주요 메서드put(K key, V value)키와 값을 HashMap에 저장한다get(Object key)키에 해당하는 값을 반환한다. 키가 존재하지 않으면 null을 반환한다.remove(Object key)키에 해당하는 키-값 쌍을 제거한다containsKey(Object k..

[프로그래머스 138476] [Java] 귤 고르기

1. 같은 종류의 원소 갯수 구하기   =>  HashMap 이용2. 1번을 내림차순 정렬3. 갯수가 많은 것부터 k개 고르기✏️ Solution 1 import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;public class 귤고르기 { public static int solution(int k, int[] tangerine) { int sum = 0; // 고를 귤의 개수 int cnt = 0; // 최솟값 카운트 HashMap map = new HashMap(); for(int num : tangerine) { map.put(n..

[프로그래머스 12945] [Java] 피보나치 수

public class 피보나치수 { public static int solution(int n) { int[] f = new int[n+1]; f[0] = 0; f[1] = 1; for (int i=2; i >>> 동적 프로그래밍 이용 ✏️ DP (Dynamic Programming) 동적 계획법- 복잡한 문제를 더 작은 하위 문제로 나누어 해결하는 알고리즘 설계 기법- 하위 문제의 결과를 저장하여 중복 계산을 피하고, 전체 문제를 효율적으로 해결한다.  DP와 재귀적 호출의 차이점 하향식(Top-down) 접근, 상향식(Bottom-up) 접근- 재귀적 호출은 주로 하향식 접근 방식을 사용한다.- 큰 문제를 작은 하위 문제로 나누어 해결하는 방식..

Pattern, Matcher Class

Java에는 정규식을 활용해 문자열을 검증, 탐색을 돕는 Pattern, Matcher 클래스가 있다Java API  java.util.regex 패키지에 포함되어 있다.  Pattern 클래스  (java.util.regex.Pattern)- 정규 표현식을 정의하는 클래스- 정규 표현식을 컴파일하여 Pattern 객체를 생성한다 📝 matches() 메서드  :  검증 후 대상문자열이 정규표현식과 일치하면 true, 그렇지 않다면 false값을 리턴import java.util.regex.Pattern;public class RegexExample { public static void main(String[] args) { String pattern = "^[0-9]*$"..

IT/JAVA 2025.02.25
반응형