ssausand-sunny / cs-study

면접.. 붙으려면 CS 공부 해야겠지?
0 stars 0 forks source link

Hashcode-Equals 메소드를 각각 설명하세요. #19

Open Hunnibs opened 2 months ago

Hunnibs commented 2 months ago

문제

Hashcode-Equals 메소드를 각각 설명하세요.

예상 꼬리 질문
  • 해시 충돌에 대해서 설명해주세요.

들어가야 할 키워드 정리

Hunnibs commented 2 months ago
질문 답변

Equals Method는 객체의 주솟값이 다르더라도 동등한 값으로 체크하기 위해 사용된다. 일반적으로 == 연산자를 통한 객체 비교 시 주소를 체크한다. Hashcode Method는 해당 객체의 주소값을 해싱을 이용해 해시코드를 만들어 반환하는 Method이다.

꼬리 질문

1. 해시 충돌에 대해서 설명해주세요. 해시 함수가 만들 수 있는 해시코드의 값은 유한하기 때문에 서로 다른 두 객체의 주솟값을 해싱했을 때 동일한 해시코드가 생성될 가능성이 있습니다. 이렇게 서로 다른 두 객체가 동일한 해시코드 값을 가지게 되는 상황을 해시충돌이라고 합니다.

kgh2120 commented 2 months ago
예상 답변 두 메서드는 모두 Object 클래스의 메서드이고, 개발자가 하나의 클래스를 만들면 모두 재정의하는 것을 권장합니다. Equals의 경우 두 객체가 서로 같은 객체인지를 판별하는 메서드입니다. 기본적으로 두 객체의 주소 값을 비교합니다. 이런 특성으로 인해 객체가 서로 같은 변수를 갖더라도 서로 다르게 인식할 수 있어, 필요에 의해 재정의가 필요합니다. hashcode의 경우 한 객체의 특정 정보를 해싱한 값을 리턴합니다. 기본적으로는 객체의 주소 값을 해싱해 리턴합니다. equals와 마찬가지로 재정의가 필요하며, 특히 collections framework에서 hash라는 키워드가 붙은 클래스들은 1차적으로 hashcode 값을 통해 객체의 존재 유무를 판단하기 때문에 재정의가 필요합니다.
예상 꼬리 질문 답변 - 해시 충돌에 대해서 설명해주세요. 해시 충돌이란 서로 다른 값이 해시 함수에 의해 동일한 해시 값이 나타나는 현상을 말합니다. ++ 해시 충돌을 해결하는 방법에 대해서 설명하세요. 해시 충돌을 해결하는 방법으로는 크게 2가지로 개방 주소법(Open Address)와 분리 연결법(Seperate Chaining)이 있습니다. 개방 주소법의 경우 Linear Probing(선형 탐색), Quadratic Probing(제곱 탐색), 더블 해싱이 있습니다. 선형 탐색과 제곱 탐색의 경우 해시 충돌이 난 지점으로부터 1씩 증가, 제곱수 단위로 증가하며 다음 버킷의 위치를 찾습니다. 이 과정에서 1차 군집, 2차 군집 문제가 발생할 수 있어 성능 저하가 발생할 수 있습니다. 이를 해결하기 위해 해시 함수를 2개 사용하는 더블 해싱 방법이 있습니다. 해시 충돌이 나면 다른 해시 함수를 적용해 다음 버킷의 위치를 찾는 방법입니다. 분리 연결법의 경우 해시 충돌이 발생하면, 해당 버킷에서 자료구조를 활용해 값을 저장합니다. 주로 연결 리스트 형태로 저장을 합니다. 하지만 이 경우 최악의 상황에서 탐색 성능이 O(N)이 나타날 수 있어, Java의 경우 최적화를 위해 Red-Black 트리와 연결 리스트 형태를 변환하며 사용합니다.
kjy0349 commented 2 months ago
예상 답안 hashCode는 해당 클래스에 해시함수를 적용해 동일한 객체인지 판별할 수 있는 해시코드를 만드는 메소드이고, Equals는 일반적으로 객체 그 자체에 적용되는 hashCode를 이용해 객체의 동일성을 판별하는것이 아닌 개발자가 정의한 일정한 기준에 따라 객체의 동일성을 판단할 수 있게 오버라이드할 수 있는 Object 객체의 메소드입니다.
예상 꼬리 질문 답안
  1. 해시 충돌에 대해서 설명해주세요.
    1. 다른 객체에 대해 해시함수를 적용한다고 하더라도, 적은 확률로 같은 해시코드가 나올 수 있기 때문에 객체의 동일성을 제대로 판단할 수 없는 상황이 생길 수 있습니다. 이를 방지하기 위해 두 개의 해시함수를 사용하거나, 이미 존재하는 해시값이 나올 경우 값에 변경을 주는 등 여러 방법으로 해결할 수 있습니다. Open Address, Seperate Chaining
Leeminw commented 2 months ago
예상 답안

hashCode는 해당 클래스에 해시 함수를 적용하여 두객체를 비교할 때 같은 객체인지를 판별하는 코드를 만드는 메소드입니다. Equals의 경우 객체가 같은 객체인지가 아닌, 개발자가 정한 기중에 따라 객체의 같음을 판별하는 메소드입니다.

예상 꼬리 질문 답안

서로 다른 객체에 해시 함수를 적용했을 때, 같은 값이 나오는 것을 해시충돌이라고 합니다. 이를 해결하기 위해 Chaining방식과 Open Addressing 방식이 있습니다. Chaining 방식은 해시값을 리스트 방식으로 저장하는 방법을 사용합니다. 다만 최악의 경우 성능이 O(n) 까지 발생할 수 있기 때문에 Java에서는 트리구조를 사용하여 구현하고 있습니다. Open Addressing의 경우 선형탐색, 제곱탐색, 더블 해싱의 방법을 사용합니다.

kgh2120 commented 2 months ago

추가질문