java
동일성 vs 동등성
주다애
2023. 8. 17. 20:59
본 게시물은 프로그래머스 FOO님의 실무 자바 개발을 위한 OOP와 핵심 디자인 패턴을 듣고 작성된 게시물입니다.
📣 동일성과 동등성
동일성 : 비교 대상이 실제로 똑같은 대상이어야 함(== 연산자 사용)
동등성 : 비교 대상이 같은 값이라고 우리가 정의한 것(equals() 오버라이딩)
동일한 인스턴스는 동등하다.
public class SomeObject {
private int intField;
private String stringField;
public SomeObject(int intField, String stringField) {
this.intField = intField;
this.stringField = stringField;
}
public int getIntField() {
return intField;
}
public String getStringField() {
return stringField;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SomeObject that = (SomeObject) o;
return intField == that.intField && Objects.equals(stringField, that.stringField);
}
}
> equals(Object o) 메소드를 오버라이딩 한 것(intellij의 자동 생성 기능 활용)
❔ equals() 메소드
equals() 메소드는 Object 클래스의 메소드이다. Object 클래스는 자바의 모든 클래스의 부모로 모든 클래스는 Object 클래스를 상속받는다.(extends Object)
public static void main(String[] args) {
SomeObject someObject1 = new SomeObject(1, "equalsTest");
SomeObject someObject2 = new SomeObject(1, "equalsTest");
SomeObject anotherObject = new SomeObject(100, "wow");
SomeObject someObject3 = someObject1;
// 동일성 비교
System.out.println(someObject1 == someObject2);
// 동일성 비교
System.out.println(someObject1 == someObject3);
// 동등성 비교 --> equals() 메소드를 오버라이딩하지 않으면 동등하더라도 false가 나온다.
System.out.println(someObject1.equals(someObject2));
// 동등성 비교
System.out.println(anotherObject.equals(someObject1));
}
1. == 을 사용한 동일성 비교 → someObject1과 someObject2는 모든 필드가 같지만 실제로 똑같은 대상이 아니다. 즉, 동일하지 않다. false
2. == 을 사용한 동일성 비교 → someObject3 = someObject1라고 정의해주었기 때문에 두 인스턴스는 동일하다.(동등성도 보장된다.) true
3. equlas() 메소드를 사용한 동등성 비교 → SomeObject class에 equals() 메소드가 오버라이딩 되어있다. 둘은 동등하다. true
4. equlas() 메소드를 사용한 동등성 비교 → 필드의 값이 다르므로 동등하지 않다. false
equals() 메소드가 오버라이딩 되어있어서 동등하다. 그렇다면 equals()메소드가 오버라이딩 되어있지 않다면?
위의 3번의 결과는 false가 나올 것이다.