반응형
Java를 사용하다 보면 언제 equals를 사용해야 하고, 언제 ==를 사용해야 하는 지 헷갈리는 경우가 있다.
예시를 통해 차이점을 알아보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { String a = "aaa"; String b = a; String c = new String("aaa"); String d = new String("aaa"); System.out.println(System.identityHashCode(a)); //1627674070 System.out.println(System.identityHashCode(b)); //1627674070 System.out.println(System.identityHashCode(c)); //1360875712 System.out.println(System.identityHashCode(d)); //1625635731 System.out.println("========================"); System.out.println("a == b : " + (a == b)); //True System.out.println("a == c : " + (a == c)); //False System.out.println("c == d : " + (c == d)); //False System.out.println("a.equals(b) : " + a.equals(b)); //True System.out.println("a.equals(c) : " + a.equals(c)); //True System.out.println("c.equals(d) : " + b.equals(d)); //True } } | cs |
위 코드를 실행한 결과값을 통해 다음과 같은 결론을 얻을 수 있다.
1. String a = "aaa" 와 String b = a는 같은 주소를 가르친다.
2. String c = new String("aaa")와 String d = new String("aaa")는 서로 다른 주소를 가르킨다.
3. == 연산은 같은 주소값인지를 비교한다. 즉, 안에 데이터는 비교하지 않는다.
4. equals 함수는 내부의 값을 비교한다.
여기서 4번 equals 함수 코드를 보면 구체적인 작동 방식을 알 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //String.java public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; } | cs |
String에 구현된 equals 함수를 보면 length를 구해 while문으로 각 char 값을 비교하는 것을 확인할 수 있다.
반응형
'∙Java' 카테고리의 다른 글
[Java] if-else 줄이는 코딩방법 (0) | 2019.01.17 |
---|---|
[Java] OOP(객체지향 프로그래밍) 특징과 꼬리질문 (0) | 2019.01.12 |
[Java] Abstract Class와 Interface (0) | 2019.01.10 |
[Java] Stack 영역과 Heap 영역 (0) | 2019.01.10 |