Java

==와 equals()는 어떠한 차이점을 가질까?

Tommy__Kim 2023. 4. 21. 15:58

그동안 Spring을 사용해 개발하면서 ==equals()의 큰 차이점을 모르는 채로 equals() 만 사용을 해왔습니다.

이 부분에 대해 정확히 개념을 잡아보려고 합니다.

String 변수 생성

String 변수를 생성하는 방식에는 두가지 방식이 있습니다.

  • literal 을 이용한 방식
  • new 연산자를 이용한 방식

[literal을 이용한 방식]

  • string constant pool 이라는 영역에 존재하게 됩니다.
  • string constant pool 에 주어진 문자열이 있는지 검색합니다.
    • 문자열이 있으면 해당 주소값을 반환
    • 문자열이 없으면 string constant pool에 넣고 새로운 주소값을 반환

[new 연산자를 이용한 방식]

  • Heap 영역에 존재합니다.

== 와 equals()

==

    == 연산자는 비교하고자 하는 두개의 대상의 주소값을 비교합니다.

equals()

    equals() 연산자는 비교하고자 하는 대상의 값 자체를 비교합니다.

코드로 알아보겠습니다

[Test Code]

@Test
    void equals() {
        String person1 = "tommy";
        String person2 = "tommy";
        String person3 = new String("tommy");
        String person4 = new String("tommy");

        // literal & literal 비교
        System.out.println("literal & literal 비교");
        System.out.println("person1, person2 '==' = " + (person1 == person2));
        System.out.println("person1, person2 'equals' = " + person1.equals(person2));

        // literal & String 비교
        System.out.println("literal & String 비교");
        System.out.println("person1, person3 '==' = " + (person1 == person3));
        System.out.println("person1, person3 'equals' = " + person1.equals(person3));

        // String & String 비교
        System.out.println("String & String 비교");
        System.out.println("person3, person4 '==' = " + (person3 == person4));
        System.out.println("person3, person4 'equals' = " + person3.equals(person4));

    }

[Test Result]

literal & literal 비교
person1, person2 '==' = true
person1, person2 'equals' = true

literal & String 비교
person1, person3 '==' = false
person1, person3 'equals' = true

String & String 비교
person3, person4 '==' = false
person3, person4 'equals' = true

person1,person2 는 literal으로, person3person4는 String으로 생성했습니다.

[literal & literal]

  • literal은 주소, 값이 같습니다.
    • == : true
    • equals() : true

[literal & String]

  • literal 과 String은 주소는 다르고 값은 같습니다.
    • == : false
    • equals() : true

[String & String]

  • String 과 String은 주소는 다르고 값은 같습니다.
    • == : false
    • equals() : true

'Java' 카테고리의 다른 글

Javadoc 이란?  (0) 2023.04.22
Java EE 와 Java SE 뭐가 다른가요?  (0) 2023.04.21
final vs finally vs finalize  (0) 2023.04.18
좋은 객체 지향 설계의 5가지 원칙  (0) 2023.04.05
다형성 (Polymorphism)  (0) 2023.04.05