Free Lines Arrow
본문 바로가기
Language/Java

[Java] String Object 와 String literal, 동일성 동등성

by skahn1215 2021. 8. 21.
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

댓글