발전하는 개발자가 되자
equals 와 == 차이 (java) 본문
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
a
와 b
는 각각 int
1을 가진다.
둘을 비교하면 ==
으로 비교하든 equlas
로 비교하든 둘다 false
가 나온다.
이유는 equals()
를 재정의 하지 않았기 때문에 상위 클래스인 Object
에서 정의된 equals()
로 동작하게 된다.
Object
는 equals()
을 아래와 같이 정의 하고있다.
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