GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Java

참조형 DataType, Stack 과 Heap 메모리 저장

Backcoder 2022. 6. 22. 18:52


1. 기본형 데이터타입 - 메모리타입과 크기 정해져있음 
boolean char int(byte short long) double(float) 

 

2. 참조형 데이터타입 
String / 배열

 


< 자바 언어 메모리값 저장 특징 >

1> 저장 특정 위치 - 주소(번지) 지정 불가  / 알 수없다. 
2> heap 영역 데이터 필요없으면 ( s; 처럼 사용하고난 후 이제 안씀 ) =>메모리 자동정리 ( Garbage Collection ) 
3> 자바의 모든 변수들은 stack 에 저장한다. 
    단, stack 에 들어가는 변수가 참조형 변수 일 경우, 주소만 stack에 저장하고, 실제 데이터는 heap 에 저장한다.   

 

< 자바 논리적 메모리 구분 >

 
< Stack 메모리 >      => 변수 선언 순서대로 저장 // 고정된 크기  // 크기에 따라 쌓이면서 켠켠히
문자 하나당 2byte   java -> 8byte 
int -> 4byte 정수 
double -> 8byte 실수 

100번지 : i = 10; 4byte         //실제값
104번지 : ( java; 8byte )      //참조값 (주소값) => 사실 s; 4byte임(주소값)   
112번지 : x = 3.14; 8byte    //실제값

//stack 고정크기로 켠켠히 저장 했는데, 중간에 104번지 크기가 바뀔경우, stack 으로만 하면 문제가 생긴다 


< Heap 메모리 >   - 가상의 공간. 주소값  => 참조형 데이터타입 => 크기가 가변적 // String, 배열  

String 

=> 대표적 참조형 data type  
java(8byte) 을 spring(12byte)로 바꾸고자 한다 

java => s(4); 라는 500번지 주소로 보내놓음                  => 500번지 : java(8) 
spring => t(4); 라는 600번지 주소로 보내놓음               => 600번지 : stpring(12) 

=> s; 를 t; 로만 바꿔준다.  ( data 크기에 변화가 없다 ) 

배열   

=> 참조형 데이터타입 (크기가 정해지지 않음. 개수에 따라 변함 )
동일 타입의 데이터 여러개 저장 , 참조형 타입 변수  
heap 영역에 배열 데이터 저장하고 stack 영역에는 주소만 저장 


stack 
100번지 : array ([] [] [] [] []) 참조형 data type 비워놓은 상태  / 주소값만 가지고 있음 
heap
500번지 : [10] [20] [30] [40] [50]     /실제값 보관중 

 


< 참조형 변수 > => "null" 일때   

String s1 = "abc"  // 주소값은 가지고 있다. 
String s2 = null;   // 주소값 저장 X  - null : 주소값조차 없다   

stack                    heap 
s1: 500           500 : "abc" 
s2 null                  X 

sout(s1.toUpperCase( )); => ABC ( 대문자로변환하는 메소드)
sout(s2.toUpperCase( )); => 오류; NullPointerException 
 //너가 가르키는 화살표 자체가 없다. (Stack ---> Heap)
 // 참조하고 있는 (주소가진) 문자열,배열이 없는데 그걸로 뭐하려고 하면 생기는 오류 

if(s2 != null) { sout(s2.toUpperCase); } <- nullPointer 에러 피하기 


int[ ] array;         --> null; 주소도 없는 상태
sout(array.length); --> NullPointerException (가르킬수도 없어)

 Stack                                Heap 
int[ ] array = new int[5];   -->  array [] [] [] [] []  
 array : 300주소값          -->   300 
//null 아닌상태. 주소 갖는다. 



String s1 = "java"; 
String s2 = "java"; 
String s3 = new String("java");  // 이것도 문자열에 값 주는 방법.
String s4 = new String("java");  // 난 기존의 Heap 에있는 100주소 싫어.
                                                      새롭게 하나 만들어 줘. -200번지

Stack                                           Heap 
s1:100번지주소                         100:"java"
s2:100번지주소(같이가짐)         100:"java"
s3: 새로운 200번지 주소            200:"java"
s4: 새로운 400번지 주소            400:"java"

s1==s2       <--- stack 저장되어있는 "주소"만을 비교하라는 의미.  같은 주소를 가지므로 True 
s3==s4       <---- 주소다르다 => False!
                      (문자열은 "참조형 타입" 이기 때문에, stack(주소)을 비교함)

JAVA 에서 == 는 Stack 에 저장된 메모리에서 주소값만을 비교하는 것

 .equals  <------ 사용하면 된다. => 주소 따라가서 Heap에 저장된 실제 문자열내용을 비교

s3.equals(s4) ==>True! 

< String/배열(참조형) 끼리 비교 > 
주소값만 동등성 비교    => "=="
실제 문자열 내용 비교   => ".equals"   
//문자열이나 배열비교는 equlas 써라! 
 String paytool = ""; 
 (paytool == args[5])   <= 의미 잘생각해 
문자열끼리 비교야 (배열에서 꺼낸 문자열) => 안에 내용 비교하려면 
 (paytool.equals(args[5])) 이렇게 해줘야해 
* 실수 많이나온다. 특히나 문자열! 주의하자.