최근 KDA(키움 디지털 아카데미)를 수강하면서,
그동안 가볍게만 다뤘던 파이썬을 제대로 배울 기회가 생겼습니다.

 

저는 주로 자바스크립트를 사용해왔기 때문에,
파이썬을 배우면서 문법적인 부분뿐만 아니라 언어 내부의 동작 방식에서도
자바스크립트와의 공통점과 차이점을 많이 느낄 수 있었고, 꽤 흥미로웠습니다.

 

그래서 이번 포스팅에서는 두 언어의 차이점 중에서도
"변수는 왜 스택에, 객체는 힙에 저장될까?" 라는 주제를 중심으로,
변수와 메모리 구조에 대해 비교 및 정리해보려고 합니다.


 

목차

    1. 자바스크립트의 자료형과 메모리 저장 방식
    2. 변수는 왜 스택에, 객체는 힙에 저장될까?
      1. 스택과 힙의 차이
      2. 스택이 CPU 캐시와 잘 맞는 이유 
      3. 메모리 계층 구조 시각화
    3. 파이썬에서는 모든 변수가 객체다
    4. 자바스크립트와 파이썬의 함수 호출 시 메모리 흐름 비교

 

1. 자바스크립트의 자료형과 메모리 저장 방식

자바스크립트에서는 기본형(Primitive)과 참조형(Reference) 두 가지 주요 타입이 있습니다.

 

1) 기본형 타입 (Primitive Type)

  • number, string, boolean, null, undefined, symbol, bigint
  • 값 자체가 스택에 저장됨.
  • 변수는 실행 컨텍스트에 키/값 형식인 객체로 등록되어 관리됨.
var data = 3

// data(식별자): 스택에 저장됨
// 3(값): 고정 크기의 값이므로 스택에 함께 저장됨

 

2) 참조형 타입 (Reference Type)

  • object, array, function, map, set, date, class 등
  • 스택에는 참조값(주소)만 저장되고, 실제 값은 힙(heap)에 저장됨.

 

왜 기본형과 같은 변수는 스택에, 참조형과 같은 객체는 힙에 저장될까?

기본형 타입은 고정된 크기이며, 메모리 참조가 필요 없기 때문에 스택에 저장됩니다.
참조형은 데이터 크기가 가변적이라 스택처럼 고정된 메모리 구조에 적합하지 않기 때문에
힙 영역에 저장됩니다.

 

 

2. 변수는 왜 스택에, 객체는 힙에 저장될까?

1) 스택과 힙의 차이

항목 스택(Stack) 힙(Heap)
메모리 구조 선입후출 (LIFO), 계단식 구조 자유로운 크기 할당, 트리 구조
속도 빠름 (고정된 순서로 할당/해제됨) 느림 (GC 등 관리 필요)
메모리 크기 작음 (고정 크기) 큼 (운영체제에서 크게 확보됨)
할당 방식 컴파일 타임에 할당 런타임에 동적 할당
사용 목적 고정 크기 변수, 함수 호출 프레임 크기 유동적인 데이터 저장 (객체 등)
해제 방식 함수 종료 시 자동 해제 가비지 컬렉터(GC)가 추적 후 해제

 

정리하자면,
스택(stack)은 빠른 접근이 가능하고, 함수가 끝나면 자동으로 메모리가 해제된다는 특징이 있습니다.

CPU 캐시와 잘 맞기 때문에 성능적으로 유리합니다.
반면 힙(heap)"어디에나" "얼마든지" 저장할 수 있는 유연성을 가지지만,
메모리 할당과 해제가 복잡하고, 이를 관리하기 위해 GC(가비지 컬렉션)가 필요합니다.

 

비유하자면,

  • 스택책상 위에 차곡차곡 쌓아두는 포스트잇 같고,
  • 방 안에 자유롭게 던져놓은 상자들과 같습니다.

 

2) 스택이 CPU 캐시와 잘 맞는 이유

스택이 CPU 캐시 hit률을 높여주는 이유

특징 설명
연속된 메모리 구조 공간 지역성 → 인접 데이터 캐시에 같이 올라감
짧은 생명주기, 반복 접근 시간 지역성 → 자주 쓰는 데이터 반복 사용
작고 고정된 크기 캐시에 올리기 적합한 사이즈

⇒ 결과적으로 성능 및 속도↑

 

3) 메모리 계층 구조 시각화

 

예를 들어보자면,

함수가 호출되면 그 함수 전용의 스택 프레임(Stack Frame)이 스택에 생성되고,

해당 함수 안에서 선언된 모든 지역 변수들은 이 프레임 안에 묶여 저장됩니다.

함수 실행이 끝나면, 프레임 전체가 pop되어 메모리에서 사라집니다.

 

 

3. 파이썬에서는 모든 변수가 객체다

파이썬은 자바스크립트와는 다른 변수 저장 로직을 가지고 있습니다.

 

  • x = 10 코드 실행 시:
    1. 10이라는 정수 객체(int)가 먼저 힙(heap)에 생성됨
    2. 이름 x가 현재 네임스페이스(scope)에 등록됨
    3. x는 10 객체를 참조하게 됨

⇒ 즉, 파이썬에서 변수는 값이 아닌 객체를 가리키는 이름일 뿐입니다.

영역 설명
스택(Stack) 함수 호출 시 생성되는 프레임 (지역 변수의 이름과 참조 정보 저장)
힙(Heap) 실제 객체 데이터(숫자, 리스트, 인스턴스 등)를 저장

 

또한 네임스페이스는 스택 프레임의 일부로 존재하며,

지역 변수 정보(이름 → 객체 참조 관계)가 네임스페이스 안에 저장되는 것입니다.

 

 

4. 자바스크립트와 파이썬의 함수 호출 시 메모리 흐름 비교

함수 호출 시 스택 프레임이 생성된다는 것은 같지만,

생성되는 스택 프레임의 구성은 두 언어가 다릅니다.

 

자바스크립트에서 함수가 호출될 때,

스택 프레임에는 함수 코드와 실행 컨텍스트가 생성됩니다.

실행 컨텍스트는 변수나 함수의 초기 상태를 관리하는 Variable Environment,

실질적으로 변수의 스코프를 관리하는 Lexical Environment, 그리고 this 바인딩 정보 등을 포함합니다.

 

반면 파이썬에서는 함수 호출 시,

스택 프레임에 리턴 주소와 딕셔너리 구조의 네임스페이스가 함께 생성됩니다.

네임스페이스에는 지역 변수 이름과 참조 정보를 관리하며,

모든 변수는 힙에 존재하는 객체를 참조합니다.

 

 

참고자료

- 모던 자바스크립트 Deep Dive

- KDA : 파이썬 프로그래밍(송치오 강사님)

+ Recent posts