티스토리 뷰

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가 나올 것이다.

 

 

'java' 카테고리의 다른 글

error-Your build is currently configured to use Java 17.0.7 and Gradle 6.8.  (1) 2023.12.05
해시(Hash)  (0) 2023.11.26
stream API + Optional  (0) 2023.07.15
stream API  (0) 2023.07.10
람다식  (0) 2023.07.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함