BackEnd/Java 11

KMP - 문자열 탐색 알고리즘 (By Java)

문자열 탐색 성능 개선 중 KMP알고리즘을 사용하면 기존의 브루트포스 알고리즘보다 더 좋은 성능이 나온다는 이야기를 들었다.정확히 어떻게 성능을 더 빠르게 하는지가 궁금하여 자세한 내용을 정리해보고자 한다. 이 글은 아래 글을 참고하여 작성하였다.https://bowbowbow.tistory.com/6 KMP : 문자열 검색 알고리즘문자열 검색이 뭐지? 워드프로세서를 사용할 때 찾기 기능을 사용한적 있을 겁니다. 브라우저에서도 Ctrl+F 단축키를 눌러 검색할 수 있습니다. 아래 이미지는 브라우저에서 "테이프"를 검색했을bowbowbow.tistory.com KMP 알고리즘이란?문자열 비교 시 효율적인 인덱스 조정을 통해 이미 비교했던 문자열을 최대한 다시 비교하지 않도록 하여 성능을 개선한 문자열 탐색..

BackEnd/Java 2024.05.29

X바(자바) finalize 메소드 쓰지마세요

Java9부터는 Deprecate 되었어요 쓰지 마세요. 과거 필자는 특정 객체 동작하면서 남긴 임시 파일을 해당 객체가 소멸될 때 제거되도록 하기 위해finalize 메소드를 사용하여 처리하려 했던 적이 있었다.허나 적용하기 위해 검색하여 보니 finalize 메소드를 사용하지 말라는 내용이 많았고이펙티브 자바에 자세하게 설명되어 있어 이 내용을 한번 정리해보고자 한다. finalizer란?자바에서 객체가 더 이상 참조되지 않을 때 Garbage Collector가 객체에 할당한 메모리를 회수하기 전객체의 finalize 메소드의 내용을 진행하는 객체 소멸자이다.이외에도 자바에는 cleaner라는 객체 소멸자가 하나 더 있다. finalizer 예시public class Finalize { @Over..

BackEnd/Java 2024.05.06

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보다 성능이 좋지 않을까? 우선 필자는 H potwings.tistory.com 이전 글에서 ArrayList와 HashMap의 contains의 성능을 비교해보았고 HashMap의 contains는 HashMap에서 get 후 null 체크를 진행하는 것을 확인하였다. 여기서 HashMap에서 get은 단순히 키값을 hashCod..

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

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한다. hashCode 메소드 객체가 저장되어 있는 주소값을 기준으로 hashCode를 생성하여 return 한다. 어플리케이션이 실행되는 동안 하나의 객체는 항상 동일한 hashCode값을 return한다. hashCode native 메소드로 경우 자바가 아닌 C, C++ 같은 네이티브 언어로 작성된 메소드이다. 자바 프로그램에서는 JNI(Java Native Interface)를 통해 호출하여 사용한다. 오버라이딩 우리는 객체를 비교할 때..

BackEnd/Java 2023.05.18