본문 바로가기
Computer Science/Programming

🧐 파이썬 코드를 잘 짜는 법 : 메모리 구조와 메모리 할당방식 이해

by 카프리썬 2022. 8. 1.
728x90

사실 지금 코틀린을 공부해야만 하는 상황인데, 갑자기 파이썬 글 쓰기..ㅎㅎ

역시 사람은 모순적인 동물이야..나는 청개구리


 

그전에 오래전에 내가 썼던 자바와 파이썬의 차이점을 먼저 되짚어봤다.

https://pearlluck.tistory.com/632

 

Python과 Java 차이점 | 객체지향vs절차지향

면접에서 자주 물어보는 기초 질문이라 한번 정리해보려고 한다. 뭔가 보수적인 회사(?) 또는 코딩테스트가 없어서 개발능력을 팩트체크해보려고 할 때 아래처럼 질문을 받았다. Q: 자주 사용하

pearlluck.tistory.com

차이점 중에서 자바는 정적 타이핑언어이고, 파이썬은 동적 타이핑 언어다. 라는 특징이 있다.

저 글을 썼던 당시에는 단지 자바는 변수를 선언해야하고, 파이썬은 안해도 된다라고만 이해했다.

그런데 지금돌아보니 조금 더 깊게 자바와 파이썬이 메모리를 할당하는 방식이 다르다고 이해할 수 있게 되었따. 

 

그렇다면 자바와 파이썬의 메모리할당방식이 어떻게 다른지 알아보잣! 


1. 메모리 구조 

학교다닐때 배운거 같은데, 파이썬의 메모리 구조는 아래와 같다. 

 

 

출처 https://jay-ji.tistory.com/105

간단하게 스택과 힙 영역만 요약하면

- 스택(stack) 영역 : 지역변수/매개변수 저장, 함수가 호출될떄 할당되고 호출이 끝나면 소멸 

- 힙(heap) 영역 : new명령으로 생성된 인스턴스 변수(사용자의 동적할당)가 저장, 메소드 호출이 끝나도 소멸되지 않음

- 데이터(data) 영역 : 전역변수/정적변수 저장, 프로그램이 시작될때 할당되고 프로그램이 종료되면 소멸

- 코드(text) 영역 : 실행할 프로그램의 코드가 저장

 

어랏? 한번 정리한적이 있었다. 이건 자바의 메모리구조였나..?ㅎ

https://pearlluck.tistory.com/10

 

메모리구조 : 메소드, 힙, 스택

정리 JVM이 메모리를 OS에게 요청하면 OS는 메모리를 할당한다. 이때 받은 메모리를 클래스영역,스택영역,힙영역으로 메모리 구조를 나눌 수 있다. ​ 클래스 영역은 프로그램이 실행하기 위해 바

pearlluck.tistory.com

 

위의 메모리 구조를 알았으니

이제 어떻게 메모리를 할당되는지를 이해하면 조금더 효율적인 코드작성에 도움이 될 것 같다.

 

2. 메모리할당 방식 : 동적할당 vs 정적할당

힙 영역은 프로그램이 실행되는 도중인 런타임에 사용자가 직접 결정하는 동적할당에 사용되고,

스택영역과 데이터 영역의 메모리크기는 컴파일 타임에 미리 결정되는 정적할당에 사용된다.

 

만약에 어떤 서비스를 사용할때 메모리가 10%만 사용되는데, 정적할당으로 미리 30%나 메모리를 잡아두고 있는거라면

20%의 메모리는 낭비가 되는것이다! 그래서 이런 서비스가 사용될때만 메모리를 사용할수 있도록 개선하는게 더 효율적일 것이다. 

 

결국, 동적할당으로 힙 영역을 적절하게 사용하면 메모리 낭비 없이 효율적으로 메모리를 쓸 수 있다. 

 

고정적으로 메모리를 할당받지 말고,
런타임에 메모리를 할당받는 '동적할당'을 통해 '힙 영역'를 사용하는게 더 효율적! 

 


그럼 본론으로 돌아가서 자바와 파이썬의 메모리할당 방식 차이점을 알아보자! 

2.1. 자바의 메모리 할당 방식

static 변수, static 클래스, static 메소드를 선언하면 data영역에 저장된다. 

그래서 메모리가 낭비 될 수 있고, 객체의 생성주기와 상관없기 떄문에 객체지향과 멀어진다. 

즉, 자바에서는 메모리를 위해 static을 남발하면 안된다! 

 

자바에서 static은 'data영역'에 저장되서 메모리에 영향을 미친다

 

2.2 파이썬의 메모리 할당 방식

C나 자바에서는 malloc으로 동적할당을 할 수 있지만, 파이썬은 개발자가 직접 메모리를 할당을 할수가 없다. 

대신 내부적으로 자동으로 메모리를 관리해주는 python memory manger가 있다. 

 

구체적인 동작 방식은 확실하지 않지만,

python memory manger가 모든 객체와 데이터구조를 private heap영역에 저장한다고 알려져있다.

디테일하게 말하면 스택영역에는 참조자를 저장하고, 힙 영역에는 객체를 저장한다. 

python memory manger 동작방식, 출처 https://jay-ji.tistory.com/105

python memory manger는 힙 메모리에 있는 객체를 참조하는형태로 동적할당을 알아서 해준다.

interpreter가 포인터를 사용해서 힙 메모리 영역의 범위를 조정하고,

자동으로 OS로 할당하지 않고 저장하고 있다가, 메모리가 필요할때마다 그때그때 할당한다.

이렇게 OS랑 소통하면서 결과값이 리턴되거나 변수와 함수의 사용이 멈추었을때 메모리가 소멸된다. 

 

 

파이썬에서 '모든 객체'들이 '자동'으로 'heap영역'에 저장된다.

 


3. 결론 : 자바와 파이썬의 메모리 할당 방식 차이점

자바에서 static method는 데이터영역에 저장된다.

무분별한 static사용은 비효율적인 메모리 사용의 원인이 될수 있어, 사용자가 직접 메모리를 관리해야한다.

 

파이썬에서는 static method던 class method던 모든 객체들이 heap영역에 저장된다.

내부에서 효율적으로 메모리를 쓸 수 있도록 자동으로 동적할당을 해줘서, 사용자가 직접 메모리를 관리할 필요가 없다. 

(뿐만 아니라 staic method는 일반 method 보다 메모리를 더 적게 차지한다!)

 

 

 

 

 

참고한 자료  및 출처 

https://jay-ji.tistory.com/105 

 

어느날 신입 개발자가 나에게 물었다..."python에서 staticmethod를 사용하는 것에 있어서 메모리 이슈

제곧내(제목이 곧 내용)입니다! ㅋㅋㅋ 최근 저희팀에 합류하신 ㅅㄱ님께서 개발 중 이런 질문을 하셨습니다. 사실 이질문을 듣고 라는 생각이 먼저 떠올랐습니다ㅠㅠ 그리고 python을 메인으로

jay-ji.tistory.com

 

같이 보면 좋을 자료

파이썬 메모리구조 및 할당방식  https://woochan-autobiography.tistory.com/867

 

Python - 메모리 구조 및 메모리 할당 과정

목차 Everything is object in Python 파이썬의 메모리 구조 파이썬에서의 Heap 사용 파이썬에서의 메모리 할당 과정 Everything is object in Python x = 10 print(type(x)) >> C에서 x = 10 이렇게 변수를 할당..

woochan-autobiography.tistory.com

동적할당과 정적할당 https://deepwelloper.tistory.com/130

 

[메모리 관리] 파이썬(Python)에서 메모리 관리하기

개발자로서 메모리 관리에 대한 이해는 중요합니다. 효율적으로 파이썬 코드를 작성한다는 것은 메모리 효율적인 코드 작성을 의미합니다. 빅데이터의 사용이 증가함에 따라 메모리 관리의 중

deepwelloper.tistory.com

 

반응형

$(document).ready(function() { var $toc = $("#toc"); $toc.toc({content: ".tt_article_useless_p_margin", headings: "h2,h3,h4"}); });