기본 타입과 레퍼런스 타입

satic·2025년 3월 18일

프로그래밍에서 기본 타입(Primitive Type)레퍼런스 타입(Reference Type)은 데이터가 저장되고 처리되는 방식에 따라 구분됩니다.


1. 기본 타입(Primitive Type)

기본 타입은 값 자체를 직접 저장하는 데이터 타입입니다.
이러한 타입들은 메모리의 스택(Stack) 영역에 저장되며, 크기가 고정되어 있습니다.

✔ 주요 특징

  • 값 자체를 저장
  • 변경 시 새로운 메모리 공간에 값이 저장됨(불변성)
  • 비교 시 실제 값을 비교
  • 메모리 사용이 효율적

✔ 대표적인 기본 타입 (언어별)

언어기본 타입
JavaScriptnumber, string, boolean, null, undefined, symbol, bigint
Javaint, double, char, boolean, float, byte, short, long
Pythonint, float, bool, str (일부는 내부적으로 객체지만 기본 값처럼 사용됨)

✔ 예제 (JavaScript)

let a = 10;
let b = a;  // a의 값을 b에 복사 (별개의 메모리 공간)
b = 20;
console.log(a); // 10 (a는 영향을 받지 않음)
console.log(b); // 20
  • ab는 서로 독립적인 값을 가짐.

2. 레퍼런스 타입(Reference Type)

레퍼런스 타입은 데이터의 참조(메모리 주소)를 저장하는 타입입니다.
즉, 값이 저장된 메모리 주소(Reference)를 가리키는 포인터 역할을 합니다.
객체, 배열, 함수 등이 이에 해당하며, 힙(Heap) 영역에 저장됩니다.

✔ 주요 특징

  • 값이 아닌 메모리 주소(참조값)를 저장
  • 동일한 객체를 참조하는 변수가 변경되면, 원본도 변경됨(가변성)
  • 비교 시 메모리 주소(참조값)를 비교
  • 크기가 동적으로 변할 수 있음

✔ 대표적인 레퍼런스 타입 (언어별)

언어레퍼런스 타입
JavaScriptObject, Array, Function
JavaString(불변이지만 객체), Array, Class, Interface
Pythonlist, dict, set, tuple(불변이나 레퍼런스 타입)

✔ 예제 (JavaScript)

let obj1 = { name: "Alice" };
let obj2 = obj1;  // obj1의 참조값(주소)을 복사

obj2.name = "Bob";

console.log(obj1.name); // Bob (obj1도 영향을 받음)
console.log(obj2.name); // Bob
  • obj1obj2는 같은 메모리 주소를 참조하므로, obj2에서 값을 변경하면 obj1도 영향을 받음.

3. 기본 타입 vs 레퍼런스 타입 비교

구분기본 타입레퍼런스 타입
저장 위치스택(Stack)힙(Heap)
저장 방식값 자체 저장메모리 주소(참조) 저장
비교 방식값 자체를 비교참조값(메모리 주소)을 비교
변경 영향독립적인 값 유지같은 객체를 참조하면 변경됨
예제 타입int, string, booleanobject, array, function

4. 메모리 구조 차이

✔ 기본 타입 (Stack)

메모리:
| 10 | ← 변수 a
| 10 | ← 변수 b (별도 공간)
  • b = a 시 별개의 공간에 복사됨.

✔ 레퍼런스 타입 (Heap)

Stack:          Heap:
| obj1 |  ----> | { name: "Alice" } |
| obj2 |  ----> | (같은 객체 참조)  |
  • obj2 = obj1 시 같은 주소를 참조.

5. 불변성(Immutable)과 가변성(Mutable)

  • 기본 타입(Primitive Type) → 불변(Immutable) (값 변경 시 새로운 메모리 할당)
  • 레퍼런스 타입(Reference Type) → 가변(Mutable) (참조하는 데이터가 변경 가능)

✔ 불변 예제 (JavaScript)

let str1 = "hello";
let str2 = str1;
str2 = "world"; // 새로운 문자열 생성

console.log(str1); // "hello" (변경되지 않음)
console.log(str2); // "world"

✔ 가변 예제 (JavaScript)

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]
  • arr1arr2는 같은 참조값을 공유하므로 한쪽을 변경하면 다른 쪽도 영향을 받음.

6. 기본 타입과 레퍼런스 타입을 다룰 때 주의할 점

기본 타입을 변경해도 원본에 영향을 주지 않음.
레퍼런스 타입은 참조를 복사하므로 원본이 영향을 받을 수 있음.
깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)를 구분할 것.
불변성을 유지하고 싶다면 Object.assign(), spread 연산자, JSON.parse(JSON.stringify(obj)) 등을 활용.


7. 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy)

복사 방식설명
얕은 복사(Shallow Copy)참조 주소만 복사 (원본과 연결)
깊은 복사(Deep Copy)새로운 객체를 생성하여 완전히 복사

✔ 얕은 복사 예제 (JavaScript)

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = { ...obj1 }; // 얕은 복사 (내부 객체는 참조)

obj2.b.c = 100;
console.log(obj1.b.c); // 100 (원본도 영향 받음)

✔ 깊은 복사 예제 (JavaScript)

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = JSON.parse(JSON.stringify(obj1)); // 깊은 복사

obj2.b.c = 100;
console.log(obj1.b.c); // 2 (원본은 영향 받지 않음)
profile
95.06.09

0개의 댓글