Hash
- Hash란 데이터를 효율적으로 저장 또는 검색하기 위해 활용되는 자료구조입니다. 실무에서도 HashMap 클래스와 같은 해시의 많은 부분들이 자주 사용되고 있음을 확인하실 수 있을 것입니다. 고정된 크기로 값을 바꾸는 함수나 알고리즘을 보통 Hash라고 하는데, HashMap 뿐만 아니라 HashSet과 HashTable과 같은 자료구조에서 많이 활용된다고 보시면 됩니다.
- Hash는 key와 value의 쌍으로 구성되어 key를 테이블에 저장할 때, key값을 해시함수(Hash Method)를 통해서 계산하고, 그 결과값을 배열의 인덱스로 사용하여 저장하는 방식입니다.
* Hash 특징 정리
1) KEY에 VALUE 를 매핑할 수 있는 데이터 구조
2) 해시함수를 통해 키의 데이터를 저장할 수 있는 인덱스를 계산
3) key값을 통해 데이터를 빠르게 탐색할 수 있어 속도가 빠름.

* Hash 활용
1) HashMap 선언
HashMap<String, String> map = new HashMap<>();
2) put() 메서드
- 데이터를 추가할 때 사용하는 메서드
- 위 이미지를 바탕으로 코드를 구현하면 아래와 같습니다.
- a, b, c, d 가 key값 / apple, banana, cherry, dragon이 value값입니다.
map.put("a", "apple");
map.put("b", "banana");
map.put("c", "cherry");
map.put("d", "dragon");
3) get() 메서드
- HashMap에서 key에 해당하는 value값을 가져올 때 사용하는 메서드
map.get("a") // key값 "a" 에 해당하는 value값 ==> "apple"
4) remove() 메서드
- HashMap에 저장되어 있는 데이터를 삭제할 때 사용하는 메서드
map.remove("c"); //key값 "c"에 해당하는 value인 "cherry"값 삭제
5) HashMap 내 모든 데이터 차례대로 출력
for(String key : map.keySet()){
System.out.println(key + " : " + map.get(key));
}
* Hashing(해싱) 이란?
- 해싱은 해시 함수에서 해시를 출력하고, 해시 테이블에 저장하는 과정을 의미합니다.
- HashMap과 같이 Hashing을 구현한 컬렉션 클래스에서는 Object 클래스에 정의된 hashCode()를 해시함수로써 사용함.
- 여기서 hashCode()는 객체의 주소를 이용하는 알고리즘을 활용해 해시코드를 만들어내기 때문에 모든 객체에 대해서 중복되지 않는 값을 제공.
- String 클래스의 경우, 서로 다른 String 인스턴스라도 같은 내용의 문자열을 가지는 경우에는 hashCode()를 호출했을 때, 동일한 값을 얻음.
String str1 = "a";
String str2 = "b";
System.out.println(str1.hashCode()); //-789789733
System.out.println(str2.hashCode()); //-789789733
System.out.println(str1.equals(str2)); //hashCode() 값이 서로 같고, equals() 메서드 수행 결과 "true"리턴 -> str1과 str2는 동일객체

* 해시 자료구조의 장점
1) 데이터 저장과 탐색 속도가 빠름.
2) key값을 찾아 value값을 바로바로 읽어올 수 있기 때문에 읽기 속도 또한 빠름.
* 해시 자료구조의 단점
1) key값과 그에 해당하는 value값까지 모두 저장해야 하므로 저장공간이 많이 필요함.
2) Hash Collision(해시충돌) 발생.
-> 해시 충돌은 서로 다른 키에 대해 같은 해시 값을 만들어 내는 경우를 말함.
오늘 공부는 여기까지입니다!
Hash에 대해서 좀 더 부연설명 하고 싶은 부분이 있다거나
제가 올린 내용 중에 틀린 부분이 있다면 언제든 댓글 환영입니다~
오늘 월요일도 고생 많으셨습니다.
한 주 알차게 시작해 봅시다!!
파이팅~!!

'JAVA' 카테고리의 다른 글
| 자바 JAVA 열거 타입 (enum) (0) | 2025.11.23 |
|---|---|
| 자바 JAVA 문자열 String 함수 & 사용법 총 정리 (0) | 2025.11.23 |
| 자바 JAVA 연산자와 자동 형변환 & 오버플로우 / 언더플로우 (1) | 2025.11.23 |
| 자바 JAVA 변수의 타입 정리 (int, long, double, String 등) + 스택과 힙 메모리 (0) | 2025.11.20 |
| 스택(Stack) VS 큐(Queue) 개념 정리 (3) | 2024.11.14 |