Equasls, HashCode에 대해서 알아보자

2022. 12. 6. 18:24BackEnd(Java)/Java

✅ 아래 내용들에 대해서 알아보자

- 동일성 & 동등성
- Equals & HashCode

 

 

 

동일성 & 동등성

 동일성이란 객체가 메모리에서 고유하게 식별되는 것을 의미한다. 즉, 객체의 참조값(주소값)이 같은 경우 두 객체는 동일한 객체이고 Java에서 == 연산자를 통해 비교할 수 있다.

 

 동등성이란 객체가 가지고 있는 값이 같은 경우 두 객체는 동등한 객체라고 의미한다. 자바에서 equals() 메서드를 재정의하여 동등성을 비교할 수 있다. 동일성과 동등성 차이를 예시 코드를 보면서 이해해 보자.

 

	class anyClass{
		int value;

		public anyClass(int value) {
			this.value = value;
		}

		//equals 재정의
		@Override
		public boolean equals(Object o) {
			if (this == o) {
				return true;
			}
			if (o == null || getClass() != o.getClass()) {
				return false;
			}
			anyClass anyClass = (anyClass) o;

			//value 라는 필드값으로 동등성을 비교
			return this.value == anyClass.value;
		}

		@Override
		public int hashCode() {
			return Objects.hash(value);
		}
	}
    
    
    ------------
    
	@DisplayName("동일성 테스트")
	@Test
	public void 동일성_테스트(){
		//given
		//when

		anyClass a=new anyClass(1);
		anyClass b=new anyClass(1);

		//then
		System.out.println("동일성 비교 ="+ (a == b)); //false
	}

	@DisplayName("동등성 테스트")
	@Test
	public void 동등성_테스트(){
		//given
		//when

		anyClass a=new anyClass(1);
		anyClass b=new anyClass(1);

		//then
		System.out.println("동등성 비교 ="+ a.equals(b)); //true
	}

 

 

anyClass라는 객체를 생성하였고 해당 클래스의 필드값 value를 동일한 값(1)을 주어서 인스턴스 2개를 생성하였다.

 

그 결과, 동일성 테스트에서는 객체의 주소값이 다르므로 false가 나오게 된다. 각 인스턴스의 주소값이 다르므로!

 

동등성 테스트에서는 객체의 필드값이 같으므로 true가 나오게 된다. anyClass의 equals() 메서드를 재정의 함으로써 anyClass의 value 필드로 구분하여 동등성을 비교하였다.

 

 


참고자료

반응형

'BackEnd(Java) > Java' 카테고리의 다른 글

volatile  (0) 2024.10.01
Hash에 대해서 알아보자  (0) 2022.12.06
CompletableFuture  (0) 2022.11.22
추상클래스 vs 인터페이스  (0) 2022.09.01
call by value? call by reference?  (0) 2022.08.22