프로그래밍에서 기본 타입(Primitive Type)과 레퍼런스 타입(Reference Type)은 데이터가 저장되고 처리되는 방식에 따라 구분됩니다.
기본 타입은 값 자체를 직접 저장하는 데이터 타입입니다.
이러한 타입들은 메모리의 스택(Stack) 영역에 저장되며, 크기가 고정되어 있습니다.
| 언어 | 기본 타입 |
|---|---|
| JavaScript | number, string, boolean, null, undefined, symbol, bigint |
| Java | int, double, char, boolean, float, byte, short, long |
| Python | int, float, bool, str (일부는 내부적으로 객체지만 기본 값처럼 사용됨) |
let a = 10;
let b = a; // a의 값을 b에 복사 (별개의 메모리 공간)
b = 20;
console.log(a); // 10 (a는 영향을 받지 않음)
console.log(b); // 20
a와 b는 서로 독립적인 값을 가짐. 레퍼런스 타입은 데이터의 참조(메모리 주소)를 저장하는 타입입니다.
즉, 값이 저장된 메모리 주소(Reference)를 가리키는 포인터 역할을 합니다.
객체, 배열, 함수 등이 이에 해당하며, 힙(Heap) 영역에 저장됩니다.
| 언어 | 레퍼런스 타입 |
|---|---|
| JavaScript | Object, Array, Function |
| Java | String(불변이지만 객체), Array, Class, Interface |
| Python | list, dict, set, tuple(불변이나 레퍼런스 타입) |
let obj1 = { name: "Alice" };
let obj2 = obj1; // obj1의 참조값(주소)을 복사
obj2.name = "Bob";
console.log(obj1.name); // Bob (obj1도 영향을 받음)
console.log(obj2.name); // Bob
obj1과 obj2는 같은 메모리 주소를 참조하므로, obj2에서 값을 변경하면 obj1도 영향을 받음.| 구분 | 기본 타입 | 레퍼런스 타입 |
|---|---|---|
| 저장 위치 | 스택(Stack) | 힙(Heap) |
| 저장 방식 | 값 자체 저장 | 메모리 주소(참조) 저장 |
| 비교 방식 | 값 자체를 비교 | 참조값(메모리 주소)을 비교 |
| 변경 영향 | 독립적인 값 유지 | 같은 객체를 참조하면 변경됨 |
| 예제 타입 | int, string, boolean | object, array, function |
메모리:
| 10 | ← 변수 a
| 10 | ← 변수 b (별도 공간)
b = a 시 별개의 공간에 복사됨. Stack: Heap:
| obj1 | ----> | { name: "Alice" } |
| obj2 | ----> | (같은 객체 참조) |
obj2 = obj1 시 같은 주소를 참조.let str1 = "hello";
let str2 = str1;
str2 = "world"; // 새로운 문자열 생성
console.log(str1); // "hello" (변경되지 않음)
console.log(str2); // "world"
let arr1 = [1, 2, 3];
let arr2 = arr1;
arr2.push(4);
console.log(arr1); // [1, 2, 3, 4] (arr1도 변경됨)
console.log(arr2); // [1, 2, 3, 4]
arr1과 arr2는 같은 참조값을 공유하므로 한쪽을 변경하면 다른 쪽도 영향을 받음.✅ 기본 타입을 변경해도 원본에 영향을 주지 않음.
✅ 레퍼런스 타입은 참조를 복사하므로 원본이 영향을 받을 수 있음.
✅ 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)를 구분할 것.
✅ 불변성을 유지하고 싶다면 Object.assign(), spread 연산자, JSON.parse(JSON.stringify(obj)) 등을 활용.
| 복사 방식 | 설명 |
|---|---|
| 얕은 복사(Shallow Copy) | 참조 주소만 복사 (원본과 연결) |
| 깊은 복사(Deep Copy) | 새로운 객체를 생성하여 완전히 복사 |
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = { ...obj1 }; // 얕은 복사 (내부 객체는 참조)
obj2.b.c = 100;
console.log(obj1.b.c); // 100 (원본도 영향 받음)
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = JSON.parse(JSON.stringify(obj1)); // 깊은 복사
obj2.b.c = 100;
console.log(obj1.b.c); // 2 (원본은 영향 받지 않음)