참조 자료형 String은 데이터값 자체를 저장하지 않고 메모리 주소값을 저장한다.
String str1 = "HelloWorld";
String str2 = "Hello";
str2 = str2 + "World";
String str3 = new String("HelloWorld");
String str4 = "HelloWorld";
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
System.out.println(str4);
if (str1 == str2) {
System.out.println("str1==str2");
} else if (str1 == str3) {
System.out.println("str1==str3");
} else if (str1 == str4) {
System.out.println("str1==str4");
}
|
cs |
예시코드의 실제 문자열은 모두 같으나 str2는 다른 문자열들의 다른 주소값을 합해서 새로운 heap영역에 할당,
str3은 new로 인스턴스를 새로 생성해서 heap 영역에 할당,
str4는 str1과 내용이 완전 같으므로 constant pool에 저장된값을 참조해서
결론은 str1==str4 만 true인 것이다.
여기서 실제 주소값을 비교해보고 싶었지만
Java에선 주소값을 직접적으로 다루지는 않는것 같다.
그래서 참조값이라도 비교해보려고 디버깅을 돌려봤는데
이클립스에서는 str1==str4로 결과값 출력과 같이 나오는데
vscode에서는 str1==str3==str4... vscode쪽이 뭔가 이상하다.
원래대로라면 새로운 heap영역을 할당받은 str3은 다른값을 참조해야되지않나?
왜 같게 나오는건지 원인을 알수가 없다.
'Java' 카테고리의 다른 글
파라미터 - 메소드에서 전역변수 사용을 지양하기 (0) | 2021.10.26 |
---|---|
메인메소드의 기능들을 각 메소드별로 분리하기 (0) | 2021.10.26 |
같은 문제, 다른 로직 (0) | 2021.10.13 |
vscode에서 args[]값 입출력하기 (0) | 2021.10.09 |
중첩 for문을 이용하여 다이아몬드 그리기 (0) | 2021.10.06 |