JAVA/java 실습

[자바JAVA] 참조형 변수의 주소값 비교 , 값 비교 equals

자바칩 프라푸치노 2020. 9. 18. 07:20

안녕하세요 자바칩 프라푸치노 입니다.

오늘은 아주아주 중요하고 앞으로도 많이 활용될 개념을 배워보겠습니다.

참조형 변수의 주소값 비교, 값 비교 입니다.

메모리상에서 어떻게 작용되는지도 봅시다.

 

먼저

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package sec01_exam;
 
public class StringEqualsEx {
 
    public static void main(String[] args) {
        
        //참조형에 쓸수있는 비교연산자는 == 와 != 이다.
        Object obj1 = new Object();
        Object obj2 = new Object();
        
        //Object의 참조변수에서 ==연산과 equals()는 같은 역할(주소값 비교)을 한다.
        System.out.println(obj1 == obj2);
        System.out.println(obj1);
        System.out.println(obj2);
        System.out.println(obj1.equals(obj2));
    
        
 
    }
 
}
 
cs

이렇게 해보겠습니다.

Object는 참조형 변수이죠.

new연산자를 쓰면 메모리 영역에서 

이렇게 heap영역에 객체가 생깁니다.

 

위 코드의 결과를 볼까요.

obj1 과 obj2는 당연히 같지 않겠죠. 

독립된 객체의 주소를 비교하기 때문입니다.

또한  equals를 써도 주소를 비교하기 때문에 false가 나오게 됩니다.

 

그럼 String의 주소값을 비교해봅시다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package sec01_exam;
 
public class StringEqualsEx {
 
    public static void main(String[] args) {
        
            
        String strVar1 = "자바칩";
        String strVar2 = "자바칩";
        //String strVar1 = new String("자바칩");
        
        String strVar3 = new String("자바칩");
        //새로운 객체 생성(주소가 달라짐)
        //주소값 비교(자바에서는 String의 리터럴이 같은 경우, 같은 번지 참조함)
        System.out.println("strVar1==strVar2 : "+ (strVar1==strVar2));
        System.out.println("strVar1==strVar3 : "+(strVar1==strVar3));//주소값 비교
        
        System.out.println();
        //값을 가지고 비교(equals는 비교 대상과 값이 같은지를 비교함)
        System.out.println("strVar1.equals(strVar3) : "+ strVar1.equals(strVar3));//값을 가지고 비교
        System.out.println("strVar1.equals(strVar2) : "+ strVar1.equals(strVar2));
        
 
    }
 
}
 
cs

이렇게 적어보았습니다.

위에서 부터 천천히 보자면

String에서 값을 지정해주는 것은 

new 를 해주고 값을 넣어주는 것과 동일 합니다.

 

이렇게 해주는 것과 동일합니다.

그런데 밑에 이제 코드를 보시면

strVar1 == strVar2 는 true가 나옵니다.

new를 한거랑 동일 하다고 했는데 왜 주소가 같냐하면요

String의 리터럴이 같을 경우 jvm이 같은 값을 가지는 주소를 쏵 훑습니다.

그리고 같은 값을 가졌을 경우 같은 주소를 참조합니다.

 

그런데 밑에 strVar1 == strVar3는 false가 나옵니다.

왜냐하면 strVar3에는 new연산자를 사용하여 새로운 객체를 만들었기 때문입니다.

그래서 같은 값을 가지더라도 독립된 객체를 만들게 된 것이지요.

밑에 이 두 코드는 true가 나옵니다.

String의 equals는 값 자체를 비교하는 것이기 때문입니다.

전체적으로 출력결과를 보시면

이렇게 나오게 되었습니다.

이렇게 메모리에 대한 이해를 하신다면 앞으로 객체지향에서도 조금 더 쉽게 문제를 푸실 수 있을 것입니다.

감사합니다.

728x90