[🥸JAVA] 자바 기본 타입 변수와 참조 변수 메모리 영역 차이(➰Heap, Stack)
📍 개요
◾ 기본 타입 변수와 참조 타입 변수에 대해 학습하고 차이를 비교해보는 시간을 가졌습니다.
📌 기본 타입과 참조 타입 변수 차이
아래에서부터는 변수 타입별로 메모리 영역이 어떻게 관리되는지에 대해 살펴볼텐데요.
⭐ 이해가 잘 되지 않으신다면, 이것만은 꼭 기억해두셨으면 좋겠습니다!
자바는 항상 변수의 값을 복사해서 대입!
기본형이면 변수에 들어있는 실제 사용하는 값을 복사해서 대입하고,
참조형이면 변수에 들어 있는 참조값을 복사해서 대입합니다.
1️⃣ 기본타입 변수
객체 없음, 스택 메모리만 사용
2️⃣ 참조타입 변수
객체 있음, 스택 메모리, 힙 메모리 둘 다 사용
▪️ 힙 메모리: 객체 저장(new 키워드), 리터럴 값 저장
▪️ 스택 메모리: 지역 변수(기본 타입 변수와 참조 변수)를 저장, 힙 메모리에 저장된 객체(변수)를 참조하는 주소값 저장
📁 기본 타입 변수의 스택 메모리
✔️ 기본 타입 변수는 스택 메모리에 직접적으로 값을 저장합니다.
// 기본형 대입
int a = 10;
int b = a;
👉 스택 메모리에 실제 값이 저장되며 기본 타입 변수는 힙 메모리를 사용하지 않습니다.
모든 기본 타입 데이터는 스택 메모리에서 직접적으로 관리됩니다.
📁 참조 타입 변수의 스택과 힙 메모리
✔️ 참조형의 경우 실제 사용하는 객체가 아니라 객체의 위치를 가르키는 참조값만 복사됩니다.
즉, 참조 타입 변수는 메모리의 번지(주소)를 값으로 갖습니다.
💡 기본형을 제외한 나머지는 모두 참조형으로 이해하면 쉽습니다!
⭐ 자바에서 String도 사실 클래스이며 참조형이랍니다.
public void anotherMethod() {
String s1 = "Hello";
}
▪️ s1은 문자열 리터럴 풀에 저장된 "Hello" 객체를 참조
즉, s1은 리터럴 풀에 있는 동일한 객체를 가진다.
public void anotherMethod() {
String s2 = new String("World");
}
▪️ s2는 `new String("World")`로 생성된 새로운 객체를 참조
이 객체는 문자열 리터럴 풀의 "World"와 같은 값을 가지지만,
별도의 힙 메모리 위치에 저장된 객체입니다.
(문자열 리터럴 풀의 "World"를 직접 참조하지 않습니다.)
👉 힙메모리는 객체와 리터럴 값이 저장되고,
스택 메모리에는 변수와 힙 메모리에 저장된 객체를 참조하는 주소값이 저장됩니다.
❗실무에서는 문자열 변수를 생성할 때 첫 번째 방식을 주로 이용합니다.
📁 JVM 구조의 GC와 참조 타입 변수의 연관성
기본적으로, 참조 변수는 객체를 가리키는 메모리 주소를 스택에 저장하고 객체 자체는 힙 메모리에 저장됩니다.
가비지 컬렉터는 힙 메모리에서 더 이상 참조되지 않는 객체를 감지하여 메모리를 회수합니다.
즉, 참조 변수와 가비지 컬렉터는 힙 메모리와 밀접하게 연관되어 있습니다.
참조가 사라지면 객체도 더 이상 사용되지 않으므로 가비지 컬렉터가 이를 정리할 수 있게 됩니다.
이러한 방식으로 JVM은 메모리를 효율적으로 관리하며,
가비지 컬렉터는 힙 메모리에서 불필요한 객체를 제거함으로써 메모리 사용을 최적화합니다.
📝 오늘의 부트캠프 회고
1️⃣ 잘했던 점
자바의 가본 타입 변수와 참조 타입 변수가 무엇인지 파악하고 어떤 메모리 영역을 사용하는지에 따른 두 변수의 차이에 대해 설명할 수 있게끔 공부를 하였습니다.
2️⃣ 부족했던 점
누가 읽어도 설명을 어렵지 않게 글을 쓰려면 여러 자료를 참고하면서 내용을 정리하면 좋을 것 같다는 생각이 들었습니다.
3️⃣ 향후 개선 방향
한 달 동안 부트캠프 시간에 배웠던 내용 위주로 내용 정리와 회고록을 작성 했었는데, 금일 이후로부터는 자습시간에 들었던 인프런 자바 강의 내용도 추가해서 올려보도록 하겠습니다.
📎 참고 자료
[인프런] 김영한의 실전 자바 - 기본편