Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

발전하는 개발자가 되자

equals 와 == 차이 (java) 본문

개발공부/Java

equals 와 == 차이 (java)

백경훈 2019. 4. 11. 16:58

equals 와 == 차이

면접을 보다 equals 와 == 의 차이를 설명해달라는 질문을 들었다.
정말 쉬운 질문 하지만 나는 면접에서 대답을 하지 못했다. 왜 그럴까?

고민을 해보니 머리로는 이해 했지만 머리속의 내용을 풀어 말로 표현 하려니 정리가 안되서 그랬던거 같다.

equals()== 는 무슨 차이가 있을까?

  • == 는 객체의 주소값을 비교하게 된다. 그래서 같은 값이라도 주소값이 다르게 되면 다르다고 나온다.
    따라서 ==int 와 같은 Primitive Type 을 비교할 때 사용한다.

  • equals() 는 개발자가 정의한 논리적인 비교를 하게 된다.


import org.junit.Test;

import java.util.Objects;

import static org.assertj.core.api.Java6Assertions.assertThat;

public class EqualsObjectTest {
    class EqualsObject {
        private int a;

        public EqualsObject(int a) {
            this.a = a;
        }

    }

    @Test
    public void 동일성() {
        int a = 7;
        int b = 7;
        System.out.println(Objects.hash(a));
        System.out.println(Objects.hash(b));
        assertThat(a == b).isTrue();
    }

    @Test
    public void 객체동일성비교() {
        EqualsObject a = new EqualsObject(1);
        EqualsObject b = new EqualsObject(1);
        System.out.println(a);
        System.out.println(b);
        assertThat(a == b).isFalse();
    }

    @Test
    public void 동등성() {
        EqualsObject a = new EqualsObject(1);
        EqualsObject b = new EqualsObject(1);
        assertThat(a.equals(b)).isTrue();
    }
}

예제와 같이 EqualsObject ab 는 각각 int 1을 가진다.

둘을 비교하면 == 으로 비교하든 equlas 로 비교하든 둘다 false 가 나온다.

이유는 equals()를 재정의 하지 않았기 때문에 상위 클래스인 Object 에서 정의된 equals() 로 동작하게 된다.

Objectequals() 을 아래와 같이 정의 하고있다.

public boolean equals(Object obj) {
        return (this == obj);
    }

그래서 아직은 둘다 주소를 비교해 false 로 나온다.

그래서 아래와 같이 equlas() 를 재정의 해주면


class EqualsObject {
    private int a;

    public EqualsObject(int a) {
        this.a = a;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        EqualsObject that = (EqualsObject) o;
        return a == that.a;
    }

    @Override
    public int hashCode() {
        return Objects.hash(a);
    }
}
@Test
public void 동등성() {
    EqualsObject a = new EqualsObject(1);
    EqualsObject b = new EqualsObject(1);
    assertThat(a.equals(b)).isTrue();
}

a 와 b는 같다고 나온다.

hashCode 를 같이 재정의 해주는 이유

list 는 주소를 참조해 보관하고 있는데
hashCode() 를 재정의 해주지 않으면 다르다고 판별게 된다.

그래서 equals() 를 재정의 할 땐 hashCode() 도 재정의 해주는게 좋다.

'개발공부 > Java' 카테고리의 다른 글

JVM과 GC(Garbage Collection)  (0) 2019.05.15
객체지향설계의 5원칙 솔리드(SOLID)?  (2) 2019.05.06
Java HashMap 이란  (0) 2019.02.12
JAVA 공부  (0) 2019.02.09
Comments