자바에서 변수는 데이터를 담기 위한 공간의 이름이고,
객체는 클래스(Class)를 기반으로 메모리에 생성된 실제 데이터 덩어리입니다.
이 변수와 객체는 자바 메모리 구조의 서로 다른 위치에 저장됩니다.
자바 프로그램이 실행되면 메모리는 크게 두 가지 영역으로 나뉩니다.
Stack (스택) 영역
Heap (힙) 영역

자바에서 변수가 저장되는 방식은 자료형에 따라 크게 두 가지로 나뉩니다.
1. 기본형(Primitive type) 변수
2. 참조형(Reference type) 변수 (객체를 참조하는 변수)
기본형(int, char, boolean, double 등)은 스택(stack) 메모리 영역에 실제 값이 저장됩니다.
int a = 5;
double b = 3.14;
이 경우, 메모리 구조는 다음과 같습니다.
Stack 영역:
+-----------+
| a = 5 |
+-----------+
| b = 3.14 |
+-----------+
객체(Object)는 new 키워드를 사용해 힙(heap) 영역에 실제 데이터가 생성되고,
그 객체의 메모리 주소(참조값)는 스택(stack)에 있는 변수에 저장됩니다.
String name = new String("자바");
이 경우 메모리 구조는 다음과 같습니다.
Stack 영역 Heap 영역
+-------------+ +--------------------+
| name | --------------> | "자바"(String 객체) |
| (주소값 저장)| +--------------------+
+-------------+
class Person {
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
int number = 10; // 기본형 변수
Person p = new Person("홍길동", 30); // 참조형 변수 (객체)
}
}
이 코드의 메모리 구조:
Stack 영역 Heap 영역
+------------------+ +----------------------+
| number = 10 | | Person 객체 |
+------------------+ |----------------------|
| p (주소값 참조) ----(참조)----->| name = "홍길동" |
+------------------+ | age = 30 |
+----------------------+
객체와 변수가 헷갈리는 이유는 참조형 변수는 객체를 직접 저장하는 게 아니라 객체의 주소(참조값)를 저장하기 때문입니다.
Person p1 = new Person("김자바", 25);
Person p2 = p1; // p1의 주소값을 복사 (객체는 하나임)
Stack 영역 Heap 영역
+------------+ +----------------------+
| p1 --------|---------------->| Person 객체 |
+------------+ |----------------------|
| p2 --------|---------------->| name = "김자바" |
+------------+ | age = 25 |
+----------------------+

기본형 변수는 스택(Stack)에 실제 값을 저장하고,
참조형 변수(객체)는 힙(Heap)에 데이터를 저장하고 스택에는 그 객체의 주소(참조값)를 저장합니다.