Java에서 객체를 비교할 때에는 ‘==‘ 연산자를 써야할까, ‘equals’ 메서드를 써야할까?
결론부터 말하자면 객체비교시 ‘==‘ 연산자는 각 객체의 주소 값을 비교한다. 반면 ‘equals’ 메서드는 객체 내부의 멤버들을 비교해서 같은지를 판단해준다.
(커스텀 객체의 경우에는 equals 메서드를 오버라이딩 해야함)
다음의 코드를 보면서 곰곰히 살펴보자.
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
String s4 = new String("Hello");
if(s1==s2) print("s1==s2");
if(s1.equals(s2)) print(“s1.equals(s2)”);
if(s3==s4) print("s3==s4");
if(s3.equals(s4)) print(“s3.equal(s4)");
if(s1==s3) print("s1==s3");
if(s1.equals(s3)) print("s1.equals(s3)");
}
public static void print(String what){
System.out.println(what);
}
우선 s1과 s2를 비교해보자.
if(s1==s2) print("s1==s2");
if(s1.equals(s2)) print(“s1.equals(s2)");
이때 s1과 s2는 객체가 아니라 primitive 한 String이다. 즉 상수와 같다. 그러므로 이러한 String에 대해서는 ‘==‘으로 비교하더라도 내용을 비교하는데 아무 문제가 없다. 또한 ‘equals’ 메서드도 문제 없이 출력된다.
이번엔 s3와 s4를 비교해보자.
if(s3==s4) print("s3==s4");
if(s3.equals(s4)) print(“s3.equal(s4)");
s3와 s4는 new String을 통해 객체화 시켰다. 아까 ‘==‘는 주소값을 비교한다고 했다. 그런데 new를 통해 생성된 객체들은 모두 다른 주소값을 가진다. 그러니 아무리 내용이 같더라도 ‘==‘비교로는 객체 내용이 같은지 판단할 수가 없다. 그래서 s3==s4에서 걸리지 않는것이다. 다만 equals 메서드는 객체 내부의 멤버를 비교하기 때문에 s3.equals(s4)가 true가 된다.
댓글 없음:
댓글 쓰기