안녕하세요 자바칩 프라푸치노 입니다.
오늘은 아주아주 중요하고 앞으로도 많이 활용될 개념을 배워보겠습니다.
참조형 변수의 주소값 비교, 값 비교 입니다.
메모리상에서 어떻게 작용되는지도 봅시다.
먼저
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는 값 자체를 비교하는 것이기 때문입니다.
전체적으로 출력결과를 보시면
이렇게 나오게 되었습니다.
이렇게 메모리에 대한 이해를 하신다면 앞으로 객체지향에서도 조금 더 쉽게 문제를 푸실 수 있을 것입니다.
감사합니다.
'JAVA > java 실습' 카테고리의 다른 글
[자바JAVA] 조건문 - 중첩 if문으로 성적 등급 나눠서 표현하기 (0) | 2020.09.23 |
---|---|
[자바JAVA] 조건문 if, if-else, switch 문 -점수 등급 출력하기, 성별 출력하기 (0) | 2020.09.23 |
[자바JAVA] 연산자 - 삼항연산자 (0) | 2020.09.17 |
[자바JAVA] 연산자 - 자바 관계 연산자 (0) | 2020.09.17 |
[자바JAVA] 10진수를 2진수로, 8진수로, 16진수로 출력하기 / Integer.toBinaryString/ Integer.toOctalString/ Integer.toHexString (0) | 2020.09.17 |