[JAVA]동일성과 동등성

무지성개발자·2023년 7월 20일
post-thumbnail

동일성과 동등성... 무슨 말장난 같다. 글자 그대로 보면완전 같은 것같은 급 정도로 구분할 수 있을 것 같은데... 어떻게 구분하고 있는 걸까?

equals()Primitive vs Reference를 알고 있으면 더 좋다.


> 예제 이미지 <무기 상점>

이번에 사용할 예제이다.
무기는 객체로 보면되고 위치는 객체가 메모리에 저장된 주소를 빗대어 표현했다.


동일성

스폰지밥, 뚱이, 징징이가 무기 쇼핑을 왔고, 동시에 가지고 싶은 무기를 손가락으로 지목했다. <스폰지밥 - 블레이드, 뚱이 - 장도리, 징징이 - 블레이드> 스폰지밥과 징징이가 똑같이 블레이드를 골랐다.

다르게 말하면 스폰지밥(변수)과 징징이(변수)가 동일한 주소에 있는 무기(객체)를 바라보고 있는 것이다.

바로 이게 동일성이다. 서로 다른 변수가 메모리의 저장 위치까지 동일한 객체라는 것이다. 객체의 동일성을 판별은 ==을 사용한다.

사족) Primitive 타입 변수는 객체가 아니라 주소가 따로 없으므로 ==을 사용하여 값이 동일 한지 판단한다.


동등성

다시 예를 들어보자.
무기 재고가 하나씩 밖에 안남아서 스폰지밥이 양보하여 <스폰지밥 - 모닝스타, 뚱이 - 장도리, 징징이 - 블레이드>를 구매 했다.

그럼 이제 equality한 무기를 가진 사람은 누구일까? 정답은 없지만 스폰지밥과 뚱이이다. 왜냐고 묻는다면 난 무기 타입을 기준으로 정했기 때문이다.

이게 바로 동등성이다.
동등성은 메모리의 주소가 다른 객체지만 객체 안의 속성을 기준으로 동등한지 판단 한다. 기준은 내가 만드는 것이며, equals()메소드오버라딩을 해서 사용하여 판단하면 된다.


코드로 보는 동등성

위 예시대로 코드를 짜봤다.
스폰지밥 - 모닝스타, 뚱이 - 장도리, 징징이 - 블레이드 구매를 했고, 스폰지밥의 무기를 뚱이, 징징이 무기와 각각 비교를 해봤다.

재정의한 equals() 코드를 보면 객체의 타입을 가져와 비교하도록 만든 것 이다. equals()는 Object클래스에서 정의 한 것이라 각자 입맛에 맞게끔 오버라이딩을 해서 써야한다.

String, Integer클래스도 들어가보면 equals()와 hashcode()를 오버라이딩해서 쓰고 있는 걸 볼 수 있다.


한 줄평 : 무지성 개발자라 코드가 구려도 이해바란다. Enum을 사용하면 깔끔해지니 시도해보자!!

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

훌륭한 글이네요. 감사합니다.

답글 달기