버글버글

Java 수업 기록 (18) Collection Framework - Hash 본문

java/java 수업 기록

Java 수업 기록 (18) Collection Framework - Hash

Bugle 2022. 8. 10. 00:00
반응형

▶ Hash 

1. 다양한 길이를 가진 데이터를 고정된 길이를 가지는 데이터로 매핑(Mappint)한 값

2. 어떤 데이터를 저장할 때 해당 데이터의 해시값을 계산해서 인덱스(Index)로 사용함

3. 어떤 데이터를 검색할 때 해당 데이터의 해시값을 인덱스(Index)로 사용하면 되기 때문에 빠른 조회가 가능

* 동일한 해쉬값을 가진 코드를 찾아서 비교를 한다. (= 동등 비교)

* Hash 비교를 하는 이유는 빠른 비교를 하기 때문이다

  ( ex : 아이디가 a로 시작하는 해쉬코드는 1번, b로 시작하는 해쉬코드는 2번 .... .... ...)

* Java의 HashCode는 객체의 참조값 이다.

* Hash set은 동일한 데이터가 들어갈 수 없다.

* 비밀번호 특징이라고 생각하면 된다.

비밀번호   해쉬 코드
A 1234
? 1234
'A'의 해쉬 코드는 '1234'가 맞다.
하지만 '1234'의 해쉬 코드가 'A'인건 알수없다.

* 만약 동일 객체가 입력(?) 될 시

 - hash code비교, hash code가 동일 할 시에 equals(문자열이 같은지)로 비교 한다.

		Book book1 = new Book(1, "어린왕자");
		Book book2 = new Book(2, "홍길동전");
		Book book3 = new Book(3, "소나기");
		Book book4 = new Book(3, "소나기");
		
		Set<Book> books = new HashSet<Book>();
		books.add(book1);
		books.add(book2);
		books.add(book3);
		books.add(book4);
		// 중복 저장 시도(정상 동작하려면 Book 클래스에 hashCode(), equals() 메소드를 Override를 해야 함)
		
		
		for(Book book : books) {
			System.out.println(book);
            
		// 1, 어린왕자
		// 2, 홍길동전
		// 3, 소나기
		// 3, 소나기

* Book 클래스를 아래와 같이 hashcode() , equals() 메소드를 override 해야 한다.

 

package ex03_hash;

public class Book {
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + bookNo;
		result = prime * result + ((title == null) ? 0 : title.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Book other = (Book) obj;
		if (bookNo != other.bookNo)
			return false;
		if (title == null) {
			if (other.title != null)
				return false;
		} else if (!title.equals(other.title))
			return false;
		return true;
	}
	
}

예제) 몇 번만에 가위 바위 보를  HashSet에 모두 넣을 수 있는지 확인한다.

import java.util.HashSet;
import java.util.Set;

public class Main {

	public static void main(String[] args) {
		
		String[] rsp = {"가위", "바위", "보"};
		
		// rsp 배열에서 임의의 값 하나를
		// rsp[0] == "가위";
		// rsp[1] == "바위";
		// rsp[2] == "보";
		
		Set<String> set = new HashSet<String>();
		int cnt = 0;
		
		while(set.size() < 3) {
			int i = (int)(Math.random() * 3);	// 0, 1, 2 중 하나
			set.add(rsp[i]);
			cnt++;
		}
		
		System.out.println(set);
		System.out.println(cnt);

	}
반응형