분류 전체보기 33

Java HashMap의 내부 동작 - 해시 버킷 개수 조정

관련 포스팅 Java HashMap의 내부 동작 - 이론편 Java HashMap의 내부 동작 - 실전편 Java HashMap의 내부 동작 - 해시 버킷 개수 조정 이번 글에서는 자바의 HashMap의 성능을 위한 해시 버킷의 개수에 관련해 알아보자 해시 버킷 개수 조정 우선 저번 글에서 확인하였듯이 HashMap에서는 데이터를 해시버킷에 나누어 저장해둔다. 여기서 해시버킷의 인덱스 계산을 "X.hashCode() % M(해시 버킷의 개수)"을 통하여 진행하는데 만일 해시버킷의 개수가 적다면 데이터가 증가할 수록 더 많은 해시충돌이 발생할 것이고, 이는 성능 저하로 이어지게 된다. 이를 방지하기 위해 HashMap에서는 데이터 개수가 "load factor(기본값 3/4) * 현재 해시 버킷의 개수"에..

BackEnd/Java 2024.04.21

Java HashMap의 내부 동작 - 실전편

관련 포스팅 Java HashMap의 내부 동작 - 이론편 Java HashMap의 내부 동작 - 실전편 Java HashMap의 내부 동작 - 해시 버킷 개수 조정 이번 글에서는 Java에 HashMap이 실제 코드로 어떻게 되어있는지 확인해보자 한다. 데이터 삽입(put) put 메소드의 데이터 추가는 아래 3가지의 경우를 순서대로 처리한다. 1. 해당 인덱스의 해시 버킷(LinkedList) 확인 - 해당 해시 버킷에 값이 없을 경우 새로운 Node 추가 후 종료 2. 해당 해시 버킷의 키 값 일치여부 확인 - key가 일치할 경우 해당 키에 대한 값 변경해준 후 종료 3. 해당 해시 버킷에 값 추가 - Tree일 경우와 / LinkedList일 경우 분기하여 처리 final V putVal(int..

BackEnd/Java 2024.04.16

Java HashMap의 내부 동작 - 이론편

해당 글은 Java8 기준으로 작성되었습니다. https://potwings.tistory.com/56 Java HashSet, HashMap 내부 구조 & List보다 contains의 성능이 더 좋은 이유알고리즘 문제를 풀거나 실무에서 Hash 자료 구조를 자주 접하게 된다. 이들을 사용하면서 궁금했던 점, 느낀 점에 대해 정리해보고자 한다. HashSet이 HashMap보다 성능이 좋지 않을까? 우선 필자는 Hpotwings.tistory.com이전 글에서 ArrayList와 HashMap의 contains의 성능을 비교해보았고HashMap의 contains는 HashMap에서 get 후 null 체크를 진행하는 것을 확인하였다. 여기서 HashMap에서 get은 단순히 키값을 hashCode와 e..

BackEnd/Java 2024.04.14

DTO 그렇게 쓰는 거 아닌데 ㅋㅋ

미안하다 이거 보여주려고 어그로 끌었다. 최근 DTO 관련된 글을 하나 읽었다. 원글 : https://medium.com/@bubu.tripathy/dto-free-java-ee70c43b5ad5 DTO-Free Java Moving Beyond DTOs to Enhance Application Design medium.com 해당 글에서 필자는 기존 DTO의 문제점을 제기하고 그에 대한 해결 방안을 제안하였다. 필자가 말하는 기존 DTO의 문제점 1. DTO는 비지니스 로직 없이 단순 데이터만 가지고 있어 해당 DTO를 다루는 곳에서 중복 코드가 발생할 수 있다. 2. 도메인 객체나 비즈니스 로직이 변경될 경우 DTO에도 동일한 수정 작업이 필요하다. 3. 대규모 어플리케이션에서 DTO의 증가함에 따..

BackEnd/Java 2024.03.17

Java HashMap이 List보다 contains의 성능이 더 좋은 이유

보통 실무에서 데이터를 불러올 경우 DB에서 정렬을 통하여 불러오기 떄문에 그 순서를 유지하기위해 ArrayList에 담는 경우가 많다. 처음 개발을 시작할 때는 자료구조의 'ㅈ'자도 몰라서 그냥 아무생각 없이 ArrayList의 contains 메소드를 호출하여 해당 데이터가 들어있는지 확인하였다. 허나 개발을 점점 해보면서 ArrayList의 contains는 시간복잡도가 O(n)이고 HashSet의 경우 시간복잡도가 O(1)이라 성능이 더 좋다는 것을 알게되었다. 이에 대해 ArrayList의 경우 모든 객체의 값을 하나하나 확인을 해봐야하나 HashSet의 경우 Key로 가지고 있기 때문에 바로 불러올 수 있어서 라고만 단순히 생각하였다. 그렇게 사용하던 중 정확히 내부에서 어떻게 동작하는지가 궁..

BackEnd/Java 2023.11.26

JAVA 객체 배열, 리스트 값 비교(Comparable, Comparator)를 통한 정렬

실무에서는 데이터 정렬 시 주로 쿼리에서 진행하지만, 최근 정렬 알고리즘 문제를 풀던 중 Comparable, Comparator을 사용하여 정렬을 하게 되어 비교 인터페이스에 대해 정리해보자 한다. 비교 인터페이스를 사용하는 이유 일반적인 숫자의 경우 기본적인 비교 연산자를 통하여 대소비교를 진행할 수 있다. 하지만 객체의 경우를 보자, 만일 String name, int age 두 개의 값을 가지고 있는 Person 객체를 비교한다해보자. Person 객체는 나이의 크기 통하여 대소비교를 진행할 지 이름값의 알파벳 순으로 대소비교를 진행할 지를 알 수 없으니 일반적인 방식으로는 대소비교가 불가능하다. 이 때 우리는 해당 객체에 비교 인터페이스를 상속시켜 해당 객체를 어떤값을 통하여 대소 비교를 진행할..

BackEnd/Java 2023.09.03

MySQL SELECT 쿼리 성능 개선

최근 회사에서 저장기간이 지난 데이터 삭제 중 slow query가 발생하였다.해당 운영 환경에는 2천만건의 데이터가 저장되어있고 과거의 데이터를 추출하려다보니 이 있어 문제가 되었다. 문제가 발생한 데이터와 쿼리는 아래와 유사한 구조였다.(예시를 위한 테스트 테이블,쿼리)SELECTseq, date, subject, contentFROM test_dataWHERE date  결합 인덱스 수정우선 처음으로 select 시 해당 테이블의 인덱스를 정상적으로 사용하지 못하여 문제가 발생한다 생각하였다.실행 계획을 확인하였을 때 아래와 같았다.따라서 인덱스를 date와 type 모두 사용하도록 수정해주면 개선되지 않을까? 라는 생각을 했다. 해당 테이블에서 select 시 date와 type는 where 절에..

개발일지/main 2023.08.20

자바 시큐어 코딩(CWE-495) 그리고 캡슐화

시작은 시큐어 코딩 가이드에 나와있는 public한 메소드를 통하여 반환된 private한 배열(CWE-495)을 보고 시작되었다.https://cwe.mitre.org/data/definitions/495.html CWE - CWE-495: Private Data Structure Returned From A Public Method (4.12)div.collapseblock { display:inline} CWE-495: Private Data Structure Returned From A Public MethodWeakness ID: 495Abstraction: VariantStructure: Simple The product has a method that is declared public, bu..

개발일지/main 2023.07.11

JAVA에 Call by refernce는 없다.

메소드 호출 시 파라미터의 값을 불러오는데는 Call by Reference와 Call By Value 두가지 방법이 있다. Call by Reference와 Call By Value란? Call By Reference (참조에 의한 호출) 메소드 호출 시 파라미터로 변수를 직접 전달한다. 메소드 내부에서 파라미터에 대한 수정이 발생할 경우 원본에도 동일하게 적용된다. 자바에서는 이 방식으로 동작하지 않는다. Call By Value (값에 의한 호출) 메소드 호출 시 파라미터로 변수의 값을 복사하여 전달한다. 메소드 내부에서 파라미터에 대한 수정이 발생할 경우 원본에는 반영되지 않는다. 자바에서의 파라미터 전달 방식은 Call By Value이다. 자바는 파라미터 전달 시 Call By Value 방식..

BackEnd/Java 2023.07.03

JAVA equals, hashCode 메소드

자바에서 모든 객체들이 기본적으로 상속받는 Object 클래스에 기본적으로 equals와 hashCode 메소드가 존재한다. equals 메소드두 개의 객체가 동일한지 비교하는데 쓰이는 메소드이다.기본적으로 두 객체의 주소값이 동일할 경우 true를 return한다.보통 equals 메소드를 오버라이드 후 객체 내부의 값을 비교하여 동일 여부를 판단하곤 한다. hashCode 메소드객체가 저장되어 있는 주소값을 기준으로 hashCode를 생성하여 return 한다.어플리케이션이 실행되는 동안 하나의 객체는 항상 동일한 hashCode값을 return한다. hashCode native 메소드로 경우 자바가 아닌 C, C++ 같은 네이티브 언어로 작성된 메소드이다.자바 프로그램에서는 JNI(Java Nati..

BackEnd/Java 2023.05.18