에러리포트

JAVA equals() 와 == 에 대한 실험

캡틴쿼카 2021. 8. 10. 00:41
반응형

 문제인식

코딩을 하다보면 분명눈으로 보기엔 같은데 == 비교를하면 다르다고 나오는 경우를 종종 찾아볼 수 있다.

해당 문제에 대해 이번에 한번 자세히 살펴보고 정리해보도록 한다.

 

 소스코드 및 결과

1.

public static void main(String[] args) {
        String stringA = "abc";
        String copyStringA = stringA;
        String newString = new String("abc");

        // equals() 메소드 : 객체끼리 내용 비교 할 수 있도록함
        System.out.println("----------------equals 비교는 값 비교");
        System.out.println("stringA.equals(copyStringA) : " + stringA.equals(copyStringA));
        System.out.println("stringA.equals(newString) : " + stringA.equals(newString));
        System.out.println("copyStringA.equals(newString) : " + copyStringA.equals(newString));
        System.out.println("");
}

결과 : 
----------------equals 비교는 값 비교
stringA.equals(copyStringA) : true
stringA.equals(newString) : true
copyStringA.equals(newString) : true

 

2.

public static void main(String[] args) {
        String stringA = "abc";
        String copyStringA = stringA;
        String newString = new String("abc");

        // == : 대상의 주소 비교
        System.out.println("---------------- == 주소 비교");
        System.out.println("stringA == copyStringA : " + (stringA == copyStringA));
        System.out.println("stringA == newString : " + (stringA == newString));
        System.out.println("copyStringA == newString : " + (copyStringA == newString));
        System.out.println("");
}

결과 : 
---------------- == 주소 비교
stringA == copyStringA : true
stringA == newString : false
copyStringA == newString : false

 

3.

public static void main(String[] args) {
        String stringA = "abc";
        String copyStringA = stringA;
        String newString = new String("abc");

        // stringA 와 copyStringA는 주소값이 같으므로 stringA를 변경한다면?
        System.out.println("---------------- stringA 변경전 주소값 비교");
        System.out.println("stringA 주소값 : " + System.identityHashCode(stringA));
        System.out.println("copyStringA 주소값 : " + System.identityHashCode(copyStringA));
        System.out.println("stringA == copyStringA : " + (stringA == copyStringA));

        System.out.println("---------------- stringA 변경");
        stringA = "def";
        System.out.println("stringA : " + stringA);
        System.out.println("copyStringA : " + copyStringA);
        System.out.println("def의 주소값 : " + System.identityHashCode("def"));
        System.out.println("stringA 주소값 : " + System.identityHashCode(stringA));
        System.out.println("copyStringA 주소값 : " + System.identityHashCode(copyStringA));
        System.out.println("stringA == copyStringA : " + (stringA == copyStringA));

        System.out.println("");
}

결과 : 
---------------- stringA 변경전 주소값 비교
stringA 주소값 : 916419490
copyStringA 주소값 : 916419490
stringA == copyStringA : true
---------------- stringA 변경
stringA : def
copyStringA : abc
def의 주소값 : 2106620844
stringA 주소값 : 2106620844
copyStringA 주소값 : 916419490
stringA == copyStringA : false

 

4.

public static void main(String[] args) {
        System.out.println("---------------- Shallow, Deep Copy");
        int[] array_1 = new int[]{0,1,2};

        // 얕은복사 : Shallow Copy
        int[] array_2 = array_1;

        // 깊은복사 : Deep Copy
        int[] array_3 = array_1.clone();

        array_1[0] = 100;
        System.out.println("array_1[0][1] 주소값 : " + System.identityHashCode(array_1[0]));
        System.out.println("array_2[0][1] 주소값 : " + System.identityHashCode(array_2[0]));
        System.out.println("array_3[0][1] 주소값 : " + System.identityHashCode(array_3[0]));
        System.out.println("array_1[0][1] 값 : " + array_1[0]);
        System.out.println("array_2[0][1] 값 : " + array_2[0]);
        System.out.println("array_3[0][1] 값 : " + array_3[0]);
}

결과 : 
---------------- Shallow, Deep Copy
array_1[0][1] 주소값 : 2006034581
array_2[0][1] 주소값 : 2006034581
array_3[0][1] 주소값 : 979294118
array_1[0][1] 값 : 100
array_2[0][1] 값 : 100
array_3[0][1] 값 : 0

 

 결과

 

  • 1번을 통해 equals() 메소드는 객체 값을 비교하는 메소드임을 알 수 있다.
  • 2번을 통해 == 는 객체의 주소값을 비교하는 것을 알 수 있다.
  • 3번을 통해 대입연산 시, =의 [우항값의 주소]를 [좌항변수의 주소]에 대입하는것을 알 수 있다.
  • 4번을 통해 얕은복사와 깊은복사의 차이를 알아보고, 깊은복사시에는 clone()을 사용할 수 있다.
    • 얕은복사(Shallow Copy)는 주소만 복사하므로 원 값이 바뀌면 대입되어진 변수 값도 바뀜
    • 깊은복사(Deep Copy)는 주소와 값을 모두 복사하므로 원 값이 바뀌어도 대입되어진 변수는 안바뀜
  • 참고소스코드 : https://github.com/greenzoo-quokka/greenzoo-java/tree/master/java-equals
 

GitHub - greenzoo-quokka/greenzoo-java: GreenZoo 블로그에서 개발한 Java 프로젝트

GreenZoo 블로그에서 개발한 Java 프로젝트. Contribute to greenzoo-quokka/greenzoo-java development by creating an account on GitHub.

github.com

 

본 포스팅은 정답노트라기 보다는
경험과 생각을 정리한 낙서장입니다.

 

반응형