학습 날짜: 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 = 10이라면, 10이라는 객체는 다음을 포함:
- 변수 '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 등)

⚙ 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 (순차 흐름 처리)

| 순서 | 논리 | 코드 |
| 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는 논리 흐름 설계 시 어려움을 줄이기 위한 도구로, 복잡한 구조나 순서를 시각적으로 정리할 때 유용
'LG U+ Why Not SW Camp 8기 > 학습 로그' 카테고리의 다른 글
| 공부 일지 #7 | mini-project; 가계부 만들기 (1) | 2025.07.22 |
|---|---|
| 공부 일지 #6 | Python 실습 (2) | 2025.07.18 |
| 공부 일지 #4 | 리눅스 명령어 및 시스템 개념 정리 (3) | 2025.07.13 |
| 공부 일지 #3 | 네트워크의 흐름과 주요 개념 정리 (0) | 2025.07.13 |
| 공부 일지 #2 | 빅데이터 및 클라우드 기초2 (3) | 2025.07.11 |