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])) 이렇게 해줘야해
* 실수 많이나온다. 특히나 문자열! 주의하자.
'Back to the Java' 카테고리의 다른 글
Modifier - 접근제어자 / static / final / +싱글톤 (0) | 2022.06.23 |
---|---|
배열을 품은 배열 - 이차 배열 (0) | 2022.06.23 |
while + true + if + break; 조건 나중에 주기! (0) | 2022.06.22 |
Back to the Basic 기본을 다잡자 2 (0) | 2022.06.21 |
Back to the Basic 기본을 다잡자 (0) | 2022.06.21 |