해시(Hash)

Sunny·2022년 10월 17일
0

해시 함수의 정의

해시 함수는 임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑하는 함수를 말함

  • 키(Key) : 매핑 전 원래 데이터의 값
  • 해시 값(hash value) : 매핑 후 데이터의 값
  • 해시 테이블(Hash Table) : 해시 값 + 데이터의 색인 주소
  • 해싱(Hashing) : 매핑하는 과정 자체


해시 함수 사용 예시

  1. 비밀번호 저장 용도

  2. 복제 문서인지 판별

  3. 검색용도


HashMap

HashMap이란 Key-value의 pair를 관리하는 클래스이다. 데이터를 저장할 때는 키(Key) 값으로 해시함수를 실행한 결과를 통해 저장위치를 결정한다. HashMap은 특정 데이터의 저장 위치를 해시함수를 통해서 바로 알 수 있기 때문에 데이터의 추가, 삭제, 검색이 빠르다는 장점이 있다.

HashMap은 키(Key) 값을 통해서만 검색이 가능하며, HashMap의 키(Key) 값은 중복될 수 없고, Value값은 Key 값이 다르면 중복이 가능하다.

HashMap 생성

HashMap<String, String> h1 = new HashMap<String, String>();
HashMap<Integer, String> h2 = new HashMap<>(); // new에서 타입 파라미터 생략 가능

HashMap 메서드
1) 데이터 추가

V put(K key, V value)   // key와 value를 저장

HashMap<Integer, String> hm = new HashMap<>();
hm.put(1, "one");
hm.put(2, "two");

2) 데이터 삭제

1. void clear()   // 모든 데이터를 삭제
2. V remove(Object key) // key와 일치하는 기존 데이터 (key, value)를 삭제
3. boolean remove(Object key, Object value) // key와 value가 동시에 일치하는 데이터를 삭제

HashMap<Integer, String> hm = new HashMap<>();
hm.put(1, "one");
hm.put(2, "two");
hm.put(3, "three");

hm.remove(1); // key가 1인 값 삭제
hm.remove(2, "two"); // key가 2이고 value가 "two"인 값 삭제
hm.clear(); // 모든 데이터를 삭제

3) 데이터 수정

1. V replace(K key, V value) // key와 일치하는 기존 데이터의 value를 변경
2. V replace(K key, V oldValue, V newValue) : key와 oldValue가 동시에 일치하는 데이터의 value를 newValue로 변경

4) 데이터 확인

1. boolean containsKey(Object Key) : key와 일치하는 데이터가 있는지 여부를 반환(있으면 true)
2. boolean containsValue(Object value) : value가 일치하는 데이터가 있는지 여부를 반환 (있으면 true)
3. boolean isEmpty() : 데이터가 빈 상태인지 여부를 반환(빈 상태면 true)
4. int size() : key-value 맵핑 데이터의 개수를 반환

5) 데이터 반환

1. V get(Object key) : key와 맵핑된 value 값을 반환
2. V getOrDefalut(Object key, V defalutValue) : Key와 맵핑된 value 값을 반환하고 없으면 defaultValue 값을 반환
3. Set<Map.Entry<K, V>> entrySet( ) : 모든 key-value 맵핑 데이터를 가진 Set 데이터를 반환합니다. 
4. Set<K> keySet( ) : 모든 key 값을 가진 Set 데이터를 반환합니다. 

HashMap<Integer, String> hm = new HashMap<>(){{
	put(1, "one");
    put(2, "two");
    put(3, "three");
}};

System.out.println(hm); // 전체 출력: {1=one, 2=two, 3=three}
System.out.println(hm.get(1)); // key 값 1의 value인 one이 출력

Map에 값을 전체 출력하기 위해서는 entrySet(), keySet() 메소드를 사용한다.

  • entrySet() 메서드는 key와 value 값이 모두 필요한 경우 사용
  • keySet() 메서드는 key값만 필요할 경우 사용하는데, key 값만 받고 get(key)를 활용하여 value도 출력 가능
// entrySet() : key와 value 값이 모두 필요한 경우
for(Entry<Integer,String> entry : map.entrySet()){
	System.out.println("key: "+entry.getKey()+" value: "+entry.getValue());
}
// 결과 예시
// key: 1 value: one


// keySet() : key를 출력하고 싶을 때
for(Integer i : map.keySet()){
	System.out.println("key: "+i+" value: "+map.get(i));
}
// 결과 예시
// key: 1 value: one

Iterator를 사용하여 표현하는 방법도 있다.

HashMap<Integer, String> map = new HashMap<>(){{
	put(1,"one");
    put(2,"two");
	put(3,"three");
}};

// entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();

while(entries.hasNext()){
	Map.Entry<Integer, String> entry = entries.next();
    System.out.println("key: "+entry.getKey()+" value: "+entry.getValue();
}

HashSet

  • SET 인터페이스에서 지원하는 구현 클래스
  • 중복된 값을 허용하지 않음
  • 저장된 순서가 보장되지 않음
  • null을 값으로 허용

HashSet의 변수 선언

// HashSet<데이터타입> 변수명 = new HashSet<데이터타입>();
HashSet<Integer> hs1 = new HashSet<>(); // new 에서 타입 파라미터 생략 가능
HashSet<String> hs2 = new HashSet<>();

HashSet의 값 추가

HashSet<Integer> hs1 = new HashSet<>();
hs1.add(1);
hs2.add(2);

HashSet<String> hs2 = new HashSet<>();
hs2.add("apple");

HashSet의 값 삭제

HashSet<Integer> set = new HashSet<>();

// set.remove(value); // value 값 삭제
// set.clear(); // 전부 삭제
set.remove(1);
set.clear();

HashSet의 크기 구하기

// 크기는 size() 메소드 이용
HashSet<Integer> hs1 = new HashSet<Integer>(Arrays.asList(1,2,3));
System.out.println("set의 크기: " + set.size());

HashSet의 값 출력

1) 전체 출력

HashSet<Integer> hs = new HashSet<>(Arrays.asList(1,2,3));
System.out.println(hs); // 출력: [1,2,3]

2) 하나씩 출력
SET에는 인덱스로 객체를 가져오는 get(index) 메소드가 없음. 대신에 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)을 제공.

HashSet<Integer> hs = new HashSet<>(Arrays.asList(1,2,3));

Iterator iter = hs.iterator();

// 먼저 가져올 객체가 있는지 hasNext() 메소드로 확인
// hasNext()의 경우 가져올 객체가 있으면 true, 없으면 false 리턴
while(iter.hasNext()){
	System.out.println(iter.next());
}

HashSet의 값 검색

HashSet 내부에 원하는 값이 있는지 확인하고 싶다면 contains(value) 메소드를 사용. 결과는 HashSet이 가지고 있다면 true, 아니면 false를 반환.

HashSet<Integer> hs = new HashSet<>(Arrays.asList(1,2,3));
System.out.println(hs.contains(1)); // 결과 : true

** 출처 : https://yjshin.tistory.com/m/entry/%EC%95%94%ED%98%B8%ED%95%99-%ED%95%B4%EC%8B%9C-%ED%95%A8%EC%88%98-%EC%9E%91%EC%84%B1-%EC%A4%91

** 출처2 : https://kadosholy.tistory.com/m/120

profile
개발에 재미를 붙여보기 :)

0개의 댓글