본문 바로가기
개발자로 나아가는 나의 언어들/JAVA

[java] hashcode()와 equals()는 뭘까?

by 승싱생숭 2021. 9. 26.
728x90

어느덧 신입사원으로 회사에 들어와 Java/Spring 개발자로 일한지 1년이 되어간다.

 

오늘 개발을 하는데 문득 이런 생각이 들었다.

매일 코드를 보고 만지지만 과연 나는 이 코드를 좋게 만들기 위해 고민하고 있는가..

 

그 생각이 들게 한 부분은 java에서 값에 대한 비교를 할때 생각이 들었다.

 

생각은 길게 했지만 진짜 파악하고 싶은 요점은 두개는 뭐야? 라는 것이 궁극적으로 궁금했기 때문에 간단하게 적어보겠다.

 

먼저 eqauls()는 ==과 같은기능을 하며 객체 내부의 값을 비교할때 주로 사용한다.

 

if(data1.equals("Y")){
	System.out.println("Y입니다.");
}

이와 같이 나는 data1의 값이 "Y"야라고 구분하고 싶을때 사용한다.

 

다음으로 hashcode()는 객체 고유의 해쉬코드를 리턴하는 함수이다.

 

이 해쉬코드가 다르다면 equals에서도 비교가 제대로 이루어지지않는다.

 

예를 들어서 설명해보자면

 

data1 = "데이터1"의 hashcode가 1234인데

data2 = "데이터1"의 hashcode가 5678이라고 한다면

 

아래와 같이 data1을 data2와  비교시

if(data1.equals(data2)){
	System.out.println("Y입니다.");
}

주소 값이 다르기 때문에 false가 리턴되어 "Y입니다."는 출력되지 않을 것이다.

 

그렇다고 해쉬코드가 다른 두 객체를 완전히 비교할 방법이 없는 것은 아니다.

 

사용하는 VO에서 hashcode를 재정의하여 사용하는 방법이다.

 

@Override
pubilc int hashCode(){
	return data.hashCode(); //data가 동일한 문자열인 경우에 같은 해쉬코드값을 리턴해준다.
}

 

코딩을 하다가 이 해쉬코드의 문제에 직면하게 된것은 아니다. 

 

하지만 equals를 쓰다보니 해쉬코드가 생각났고 궁금점이 생겨 두서없이 글을 정리하게 되었다..

728x90