728x90

일차원 배열 예제를 풀다가 분명 똑같이 생긴 문자열 두 개를 같다(==)고 놓았는데

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

 

728x90

'Java' 카테고리의 다른 글

SOLID, 객체 지향 설계  (1) 2023.03.15

+ Recent posts