본문 바로가기

공부 일지 #5 | Python의 동작 원리: 메모리 구조부터 NS-Chart까지

@studying:)2025. 7. 15. 16:18

학습 날짜: 2025.07.14 ~  2025.07.15


📌 Python의 메모리 관리 및 동작 구조

  • 파이썬은 메모리 누수가 거의 없고, 자동 메모리 관리(Garbage Collector)를 통해 불필요한 객체를 알아서 제거함
  • C나 Java와 달리, 메모리 해제를 수동으로 관리할 필요 없음
  • 객체 지향(Object-Oriented Programming, OOP)을 기반으로 설계되어 모든 것이 객체로 처리됨
  • 파이썬의 객체는 id(주소), type(자료형), count(참조 수)를 가진 구조체로 되어 있음
    • x = 10이라면, 10이라는 객체는 다음을 포함:
      • id: 객체의 메모리 주소 (예: 0x1af2)
      • type: 자료형 정보 (예: int)
      • count: 참조된 횟수. 다른 변수나 연산이 이 객체를 참조할 때마다 증가하고, 해제되면 감소함. referencing된 것이 없을 시 메모리에서 삭제됨.
    • 객체를 단순한 값(value)이 아닌 "정보와 method 가진 존재"로 다룸
    • method는 데이터 소유 객체가 사용할 수 있는 함수로, 일반적인 function과 구분됨
  •  변수 'x'는 객체를 참조하는 이름(tag)일 뿐, 값을 직접 저장하지 않음


📦 Python vs 타언어의 메모리 구조 비교

🟦 타 언어(ex. Java) 구조 요약

  • Java는 유한한 메모리에서 다음과 같은 메모리 구조를 갖는다:
    • Code Segment: 실행 코드 저장
    • Heap: 객체, 참조형 변수 등 동적 데이터 저장
    • Stack: 함수 호출 시 지역 변수, 호출 순서 저장
  • 예시: int a; a = 10 → 정수형 공간(4byte)을 만들고 a에 값을 저장
  • Program Counter가 Code Segment의 코드를 한 줄씩 읽고, Stack에서 실행
  • 사용이 끝난 객체는 free(x) 등으로 명시적으로 해제해야 함

🟨 Python 구조 요약

  • 예시: a = 9 → 뒤에서 부터 해석
    • 먼저 Heap 메모리에 9 객체를 생성하고
    • Stack에는 a라는 이름을 만든 후, 이를 해당 객체로 referencing함
    • 메모리 주소 예시: 0x1af2 (2byte 단위 주소)
  • 변수는 값을 직접 저장하지 않고, 객체의 주소를 참조함
  • 변수를 재할당해도 기존 객체를 수정하는 것이 아니라 새로운 객체를 참조함
  • Python은 자동으로 GC(Garbage Collector)가 동작하여 참조되지 않는 객체는 메모리에서 제거함
  • a = 9 후 a = 10처럼 값을 바꾼다고 해도,
    • 기존 값을 수정하는 것이 아니라
    • 새 객체를 생성하고 변수의 참조만 바꾸는 것임
  •  이는 파이썬의 immutable 객체 특성 때문임 (int, float, str 등)
출처: http://medium.datadriveninvestor.com/python-memory-management-3cc903fd4fc1

 

⚙ Built-in 함수와 메모리 동작

  • 예: print() 함수
    • Python에서는 함수도 객체이므로 heap 메모리에 저장
    • 함수가 호출되면, 호출 정보를 담은 Stack Frame이 생성되어 Stack에 올라감
    • 실행 종료 시 해당 프레임은 제거됨
  • 함수 분류:
    • method: 객체가 소유한 함수 (list.append())
    • built-in function: 기본 내장 함수 (print(), len())
    • user-defined function: 사용자가 정의한 함수
    • property

📑 변수명 사용 시 주의사항

  • _ (언더스코어)로 시작하는 변수명은 가급적 피하는 것이 좋음
    • 이유:
      • 대화형 인터프리터 환경에서 _는 마지막 결과를 저장
      • 함수 내부에서 임시 변수나 내부 구현용으로 자주 사용됨
      • 특수 목적(예: _var, __var__)으로 사용되는 경우가 많음

🔁 자료형 및 형 변환 (Casting)

기본 데이터 타입 (Basic Data Types)

예시 타입
10 int(정수형)
10.0 float(실수형)
"10" str(문자형)
True / False bool(불형)
    • immutable 특성
      • 이 값들은 변경 불가능(immutable)하며, 변수의 값 변경은 새로운 객체 생성 + 참조 변경으로 처리됨
    • 문자열의 슬라이싱
      • 문자열은 연속된 메모리 공간을 사용
      • 메모리의 시작 주소(id)가 중요함
      • 슬라이싱이 가능한 이유는 문자열이 length 정보를 포함하고 있어서 해당 길이만큼만 주소를 옮기기 때문
      • 슬라이싱은 "이상 ~ 미만" 원칙 (a[1:4]은 1, 2, 3번 인덱스만 포함)

형 변환 (Casting)

  • 형 변환이란 값의 타입을 변경하는 작업
    • int("10") : 문자열 → 정수
    • float(3) : 정수 → 실수
    • str(9.8) : 실수 → 문자열

📊 NS-chart

  • Process Block (순차 흐름 처리)
https://en.wikipedia.org/wiki/Nassi%E2%80%93Shneiderman_diagram
순서 논리 코드
1 두 수를 사용자 입력 받기 사용자 입력을 통해서 “100 200”의 문자열을 입력 후,
user_input에 저장
2 user_input에 저장된 문자열을 두 조각으로
분리 후,
각각의 데이터를 var1, var2 에 저장 
var1, var2 = user_input.split()
3 var1, var2에 저장된 데이터를
정수형 데이터로 변환 후 자신에게 저장
var1, var2 = int(var1), int(var2)
4 var1 + var2 결과를 result에 저장 result = var1 + var2
5 결과물 출력 print(result)

 

  • Branch Block (조건 분기)
  • 조건에 따라 흐름이 나뉘는 구조
  • Python에서는 if 문을 이용해 구현
  • NS-Chart에서는 조건 다이어그램 형태로 표현됨

💡 NS-Chart는 논리 흐름 설계 시 어려움을 줄이기 위한 도구로, 복잡한 구조나 순서를 시각적으로 정리할 때 유용

 

studying:)
@studying:) :: what i studied

studying:) 님의 학습 여정을 기록하는 블로그입니다.

목차