일차원 배열 예제를 풀다가 분명 똑같이 생긴 문자열 두 개를 같다(==)고 놓았는데
false가 되는 것이다.
문제의 원인은 자바 메모리 구조인 stack과 heap에 있었다.
분명 CS50 강의에서 배웠었는데 ,,,
Heap - 동적 메모리 할당
참조형 데이터 타입
: 데이터 크기가 가변적
변수를 순서대로 저장 x
- > 변수 동적 할당/해제
ex) String, 배열, 클래스, 인터페이스
Stack - 정적 메모리 할당
기본형 데이터 타입
: 데이터 타입과 크기가 정해져 있음
변수를 순서대로 저장 o
ex) byte, char int, boolean
참조형 데이터 타입 String은 메모리를 다음과 같이 저장한다.
heap에 실제값 저장 / stack에 주소값 저장
그러니까 문자열 String 데이터는
주소값 != 실제값 이다.
예제
String s1 = "java";
String s2 = "java";
String s3 = new String("java");
String s4 = new String("java");
위 4개의 문자열 모두 보기에는 java라는 똑같은 단어로 보이지만,
stack과 heap을 살펴보면 전부 같지는 않다.
stack (주소값) | heap (실제값) |
s1:100 / s2:100 | 100:java |
s3:300 | 300:java |
s4:400 | 400:java |
s1, s2는 stack에서 100이라는 주소를 가리키고 있고, 그 주소를 따라가면 heap 참조영역에 java라는 값을 가지고 있다.
하지만 같은 문자열이라도 new 를 한다면 새로운 주소값에 저장한다.
s3은 300이라는 주소를, s4는 400이라는 주소를 가지고 있는 것이다.
s1 == s2 // true
s3 == s4 // false (같은 문자열 "java"지만 stack 저장 주소값이 다르기 때문에 false이다.)
만약 실제값이 같은지 비교하고 싶다면 equals() 메소드를 쓴다.
s3.equals(s4) // true
오늘의 결론
String 값 비교할 때,
== : 주소값 비교
equals() : 실제값 비교
[ Reference ]
[Java/Stack/Heap] JAVA의 Stack과 Heap의 이해를 통해 Java의 메모리 관리
# [Java/Stack/Heap] JAVA의 Stack과 Heap의 이해를 통해 Java의 메모리 관리 - 최근 수정일 : 2017.05.31 ## 1. 배경. C언어를 하시던 선임께서 Python의 Stack과 Heap의 메모리 할당을 정확히 모르겠다는 얘기..
postitforhooney.tistory.com
'Java' 카테고리의 다른 글
SOLID, 객체 지향 설계 (1) | 2023.03.15 |
---|