상세 컨텐츠

본문 제목

동등성(Equality) VS 동일성(Identity)

Java

by AyaanDev 2023. 2. 15. 06:13

본문

반응형

동등성 vs 동일성

동등성: 두 객체의 내용이 완전히 동일한 것

동일성: 두 참조변수가 같은 메모리 공간을 가리키고 있는경우. 즉 주소값이 같은경우

Member member1=new Member('이안',1);
Member member2=new Member('이안',1);
Member member3=member1

System.out.println(member1==member2);  // 1
System.out.println(member1==member3);  // 2

Java에서 참조변수 끼리의 ==연산은 참조변수의 값. 즉, 참조변수가 가리키고있는 메모리 주소의 값을 비교한다. 따라서 이는 동일성을 비교하는 것으로 볼 수 있다.

 

1번: member1==member2?

Java에서 객체가 생성될 때 힙공간에 새로운 메모리공간을 할당받는다. 따라서 서로 다른 객체는 항상 다른 메모리주소값을 가진다. member1과 member2의 경우 내용물은 같을지라도 서로 다른 메모리공간에 저장된 객체이므로 1번에서 false가 반환될 것이다.

member1과 member2는 동등하지만 동일하지는 않다.

 

2번: member1==member3?

member3=member1은 member1의 참조변수값을 member3에 할당하므로 member1과 member3가 가리키고 있는 객체는 서로 같다. 따라서 2번코드에서 true가 반환될 것이다.

member1과 member3는 동일하다.

 

“동일하다는 것은 같은 객체를 가리키고 있다는 의미이므로 두객체가 동일하면 두 객체는 동등하다”는 참인 명제이다.

Java에서의 동일성 비교와 동등성 비교

Java의 Object클래스는 equals()메소드를 제공한다.

public boolean equals(Object object){
    return (this==object)
}

객체끼리의 ==비교는 참조변수의 값을 비교한다. 즉, 참조변수가 가르키고있는 메모리의 주소를 비교해 결과값을 반환한다. 따라서 Object.equals()메소드는 동일성을 비교한다.

우리는 종종 객체끼리의 비교에서 동일성이 아닌 동등성을 비교하고 싶을 때가 있다.

이때는 Object클래스의 equals메소드를 override하여 두 객체의 내용이 맞는지를 판단한다.

Class Member{
    String name;
  int id;

    Member(String name,int id){
      this.name=name;
        this.id=id;
  }

    @Override()
    public boolean equals(Object object){
      if(object!=null && object instance of Member){
            return (((Member)object).name.equals(this.name) && ((Member)object).id==this.id)
        }else
                return false;

  }
}
Member member1=new Member('이안',1);
Member member2=new Member('이안',1);


System.out.println(member1.equals(member2); //1

위 코드를 확인하자.

앞선 예시와는 다르게 equals를 override한 후 member1과 member2를 1번코드에서와 같이 비교하면 결과값은 true가 반환된다.

정리

  1. 동등성이란 두 객체의 내용이 일치하는 것을 말하며 동일성이란 실제 같은 객체인가 즉, 같은 메 모리 주소를 가리키고 있는가를 말한다.
  2. 참조변수끼리의 ==연산은 동일성을 비교한다.
  3. 객체끼리의 동등성을 비교하기위해서는 Object의 equals메소드를 override하여 사용한다.
반응형

'Java' 카테고리의 다른 글

객체 지향 설계의 5원칙(SOLID)  (0) 2023.05.30
[JAVA] Singleton 패턴에 대해 알아보자  (0) 2023.04.11
String vs StringBuffer vs StringBuilder  (0) 2023.04.03

관련글 더보기

댓글 영역