728x90
반응형
동일성 동등성
Java 에서 비교를 할때 무조건 == 비교연산자를 쓰면 큰 실수를 할수 있다.
동등성과 동일성 때문이다.
- 동일성: 객체가 참조하고 있는 주소값을 비교한다.
- 동등성: 객체가 가지고 있는 값으로 비교한다.
예제
하나로 쉽게 이해 할 수 있다.
코드
System.out.println("==========literal==========");
1. String string1 = "Test";
2. String string2 = "Test";
3. System.out.println("string1: "+string1);
4. System.out.println("string2: "+string2);
5. System.out.println("string1==string2: "+ (string1==string2));
6. System.out.println("string1.equals(string2): "+string1.equals(string2));
System.out.println("\n==========Object==========");
// String 을 생성자로 생성
7. String stringObj1 = new String("TEST");
8. String stringObj2 = new String("TEST");
9. System.out.println("stringObj1: "+stringObj1);
10. System.out.println("stringObj2: "+stringObj2);
11. System.out.println("stringObj1==stringObj2: "+ (stringObj1==stringObj2));
12. System.out.println("stringObj1.equals(stringObj2): "+stringObj1.equals(stringObj2));
결과
==========literal==========
string1: Test
string2: Test
string1==string2: true
string1.equals(string2): true
==========Object==========
stringObj1: TEST
stringObj2: TEST
stringObj1==stringObj2: false
stringObj1.equals(stringObj2): true
literal 비교방식
1~2번:
리터럴방식으로 생성했다.
그래서 비교할때 ==, equal 둘다 True가 된다.
5번:
동일성으로 주소값을 비교한다.
- 둘다 같은 값을 참조하고 있다: true
6번:
동등성으로 값을 비교한다.
- 둘다 같은 값이다: true
설명
- 자바 heap 영역에서 리터럴로 Stinrg을 생성하면 다음과 같은 구조를 가진다.
- String const pool 에 Test 하나가 존재 하게 되고
- string1, string2 둘다 동일한 문자열을 참조하게 된다.
Object 비교방식
7~8번:
Object 방식으로 생성했다.
그래서 비교시 ==: false, equal: True가 된다.
11번:
동일성으로 주소값을 비교한다.
- 다른 인스턴스 이다: false
12번:
동등성으로 값을 비교한다.
- 둘다 같은 값이다: true
설명
- 자바 heap 영역에서 객체방식으로 Stinrg을 생성하면 각각의 instance가 만들어진다.
- stringObject1, stringObject2 각각의 객체를 가진다.
결론
객체가 동일한지 비교할때는 ==
값을 비교할때는 equals 를 사용하자.
728x90
반응형
'Language > Java' 카테고리의 다른 글
[Java] Checked Exception, Unchecked Exception (0) | 2021.08.23 |
---|---|
[Java] String, StringBuffer, StringBuilder (0) | 2021.08.23 |
[Java] Annotation (0) | 2021.08.20 |
[Java] Collection Framework (0) | 2021.08.20 |
[Java] Lambda (0) | 2021.08.06 |
댓글