비트마스킹 기본 연산1.1 특정 비트 확인 (Check)boolean isSet = (mask & (1 `1 `&` 연산을 통해 i번째 비트가 1인지 0인지 확인 가능.1.2 특정 비트 세팅 (Set)mask |= (1 i번째 비트를 1로 설정한다.1.3 특정 비트 해제 (Clear)mask &= ~(1 i번째 비트를 0으로 만든다.1.4 특정 비트 뒤집기 (Toggle)mask ^= (1 i번째 비트를 1이면 0, 0이면 1로 바꾼다. /2 대신 >> 1, *2 대신 `/2` 연산은 `>> 1`로 대체 가능`*2` 연산은 `컴파일러가 대부분 최적화하므로 큰 체감은 없을 수 있으나, 간단한 비트 연산을 직접 사용하면 의도를 더 명확히 드러낼 수 있음. 방문 배열(visited) 대체 개념기존에는 bo..
개요일반적으로, 우리는 자바 HashMap이 평균적으로 O(1)의 시간 복잡도를 가진다고 배웁니다. 하지만 “해시 충돌(Hash Collision)”이 심해지면 성능이 급격히 떨어질 수 있다는 사실은 자칫 놓치기 쉽습니다. 또한, CPU 캐시 구조와 “참조 지역성(Reference Locality)”을 이해하면, 왜 이 문제가 현실에서 더 크게 체감되는지 알 수 있습니다. 이 주제는 백준 7453 번 문제를 풀다가 경험하게 되었는데https://www.acmicpc.net/problem/7453 C++,C 에서는 기존의 방법처럼 2개씩 쌍으로 묶어서 계산한다음에 한쪽 값을 해시 맵에 넣어두고 0을 만들기 위한 보수가 존재하는지 hash key 탐색으로 풀렸지만 자바의 경우에는 그렇지 않았다. 탐색 길이인..
개요자바 8에서 람다 표현식은 기존의 익명 클래스 방식과 다르게1. 익명 클래스를 생성하지 않고2. 바이트코드 수준에서 최적화된다.그럼에도 불구하고 람다를 배우면 항상 그냥 순회하는게 성능이 더 좋아~ 오버헤드가 발생해~ 로만 대강 알고있던 성능저하가 존재한다고 알고있었다. 그럼에도 불구하고 개발자들이 람다라는 표현식의 성능 최적화를 위해 어떻게 이를 구현했는지 바이트코드 분석을 통해 알아보자. 요약디슈거링(Desugaring)이 수행되며, 람다 표현식은 일반적인 정적 메서드로 변환된다.이후, 실행 시점에서 `invokedynamic` 바이트코드를 활용하여 동적으로 `MethodHandle`을 참조하게 된다. 디슈거링(Desugaring) 개념자바 8에서 람다 표현식은 내부적으로 익명 클래스를 생성하지..
개요자바 8의 핵심 기능 중 하나인 람다 표현식과 함수형 인터페이스의 개념을 살펴본데에 이어,@FunctionalInterface 구현체의 작성법과 생략 가능한 메서드 등을 통해서 람다 표현에 대해 익숙해진다. 또한 람다 표현식의 간소화가 어떻게, 왜 가능한지에 대해서도 확인해보자 또한, 이펙티브 자바 7장 아이템 44에서는 함수형 인터페이스를 직접 만들 경우 @FunctionalInterface 애너테이션을 반드시 사용하라고 권장한다. 그 이유는 다음과 같다.의도 명확성 – 해당 인터페이스가 람다 용도로 설계되었음을 명확히 알린다.컴파일러 검증 – 인터페이스가 정확히 하나의 추상 메서드만 가지도록 강제한다.유지보수성 향상 – 실수로 메서드를 추가하는 것을 방지하여, 코드의 안정성을 높인다. 꼭 직..
개요자바 8의 핵심 기능 중 하나인 람다 표현식과 함수형 인터페이스의 개념을 살펴본다. 이를 통해 코드의 간결화 및 유지보수성 향상의 이유를 이해하고, 자바 아키텍처 관점에서의 변화도 함께 분석한다. 배경: 익명 클래스에서 람다 표현식으로 자바 8 이전에는 특정 동작을 전달하기 위해 익명 클래스를 사용해야 했다. 예를 들어, `Comparator`를 활용하여 정렬을 수행하는 방식은 다음과 같다. 하지만 이 방식은 코드가 장황하고 보일러플레이트 코드가 많다. 자바 8부터는 람다 표현식을 활용하여 이를 간결하게 줄일 수 있다. 람다 표현식을 사용하면 불필요한 클래스 선언 없이 직관적으로 동작을 표현할 수 있다. 함수형 인터페이스와 `@FunctionalInterface`람다 표현식을 적용할 수 있는 함수형..