군대 가기 전에 진짜 개발자가 되는 방법을 공유한다.


내가 제대할 때쯤 다들 진짜로 만나자 ㅇㅅㅇ


HashTable vs HashMap vs ConcurrentHashMap에 대한 고찰


====================================

1. HashFunction이란 무엇인가?

2. Hash를 이용하는 컬렉션을 이용하면 hashCode(), equals()를 재정의 해라!

3. HashTable vs HashMap vs ConcurrentHashMap

4. HashTable vs ConcurrentHashMap 성능 비교

====================================


1. HashFunction이란 무엇인가?

Hash란 위키백과 정의에 따르면 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수야.


여기서 나온 Output 값이 우리는 해시 값이라고 불러. 이 Hash 값은 단방향이야.


이게 무슨 뜻이냐면 Input -> HashFunction() -> Output 과정을 거쳐서 나온 해시 값은 역 추적이 불가능해.


즉 Output 값을 가지고 Input 값을 추측하는 건 불가능해. 사실 Hash 자체가 어려운 개념은 아니야


우리도 은연중 많이 사용하고 있어, 예를 들어 너가 Spring Security를 이용해서 패스워드 암호화를 한다 하자.


너는 BcryptPasswordEncoder를 Bean으로 등록하잖아 이 Bcrypt가 Hash Function 종류 중 하나야


또 다른 경우는, 파일 해시 값으로 클라우드 검열에도 사용할 수 있어 예를 들어 너가 클라우드에 야동을 올렸으면


파일의 내용을 확인하지 않고, 해시 함수로 너의 파일이 야동인지 아닌지 확인할 수 있지(물론 이 경우 클라우드에서 너가 가지고 있는 야동 파일에 대한 해시 값이 블랙리스트에 등록되야함)


이 처럼 많은 경우에 해시를 사용할 수 있고, 유용하지


2. Hash를 이용하는 컬렉션을 이용하면 hashCode(), equals()를 재정의 해라!

Java에서 대표적으로 Hash를 이용하는 컬렉션이 있어. 뭔지 모르겠다고..?(그냥 뭐 Hash붙으면 이용 하는거지 ㅋㅋ)


HashMap, HashSet, HashTable, ConcurrentHashMap... 등 많은 컬렉션이 HashFunction을 이용해


그럼 Java는 무슨 맞아. Object에 정의 된 hashCode() 메서드를 호출해


이 말은 컬렉션(Hash를 이용한)에서 어떤 객체의 해시 값을 얻는데에 hashCode()를 사용한다는 뜻이야.


결국 Hash를 이용한 컬렉션들을 사용하려면 hashCode()를 재정의 해야해.


그렇다면 hashCode()를 어떻게 정의해 줘야 할까? 또 hashCode()만 정의하면 끝인가?



hashCode에 대한 일반적인 규약은 다음과 같아


1. 자바 응용 프로그램을 실행하는 동안 동일한 개체에서 두 번 이상 호출될 때마다,

hashCode 메서드는 개체에 대한 동등한(equals) 비교에 사용되는 정보가 수정되지 않는 한 동일한 정수를 일관되게 반환해야 합니다.

이 정수는 응용프로그램의 한 실행에서 동일한 응용프로그램의 다른 실행까지 일관성을 유지할 필요가 없습니다.


2. 두 개체가 equals(Object) 메서드에 따라 같으면 두 개체 각각에 대해 hashCode 메서드를 호출하면 동일한 정수 결과가 생성되어야 합니다.


3. 두 개체가 등호(Object) 메서드에 따라 동등하지(equals) 않은 경우 두 개체 각각에 대해

hashCode 메서드를 호출하는 것은 별개의 정수 결과를 생성해야 할 필요가 없습니다.

그러나 프로그래머는 불평등한 객체에 대해 뚜렷한 정수 결과를 생성하는 것이 해시 테이블의 성능을 향상시킬 수 있다는 것을 알아야 한다.


즉. 논리적으로 같은 객체는 해시 코드를 반환해야 해 또한


논리적으로 다른 객체라고 판단해도 꼭 다른 정수 결과를 생성해야 할 필요는 없어.(단 성능이 떨어질 수 있음)


그럼 위에 질문에 대답할 수 있어(HashCode만 재정의 하면 끝인가?)


예를 들어 HashCode만 재정의 하면 되는거 아닌가? 굳이 equals 까지 재정의 해야 하는가? 정답은 HashCode만 재정의 하면 문제가 발생할 수 있어


예를 들어, HashMap, HashTable등 내부적으로 put, get을 하는 중 equals()를 사용하는데 이때 문제가 발생할 수 있어


역시 hashCode, equals 같이 재정의 해야 하는게 맞아.




봇치 더 락은 내 인생 애니야, 이거 보고 진짜가 되려고 노력하자


너무 글이 길어져서 3, 4 챕터는 다음글로~