사실 지금 코틀린을 공부해야만 하는 상황인데, 갑자기 파이썬 글 쓰기..ㅎㅎ
역시 사람은 모순적인 동물이야..나는 청개구리
그전에 오래전에 내가 썼던 자바와 파이썬의 차이점을 먼저 되짚어봤다.
https://pearlluck.tistory.com/632
차이점 중에서 자바는 정적 타이핑언어이고, 파이썬은 동적 타이핑 언어다. 라는 특징이 있다.
저 글을 썼던 당시에는 단지 자바는 변수를 선언해야하고, 파이썬은 안해도 된다라고만 이해했다.
그런데 지금돌아보니 조금 더 깊게 자바와 파이썬이 메모리를 할당하는 방식이 다르다고 이해할 수 있게 되었따.
그렇다면 자바와 파이썬의 메모리할당방식이 어떻게 다른지 알아보잣!
1. 메모리 구조
학교다닐때 배운거 같은데, 파이썬의 메모리 구조는 아래와 같다.
간단하게 스택과 힙 영역만 요약하면
- 스택(stack) 영역 : 지역변수/매개변수 저장, 함수가 호출될떄 할당되고 호출이 끝나면 소멸
- 힙(heap) 영역 : new명령으로 생성된 인스턴스 변수(사용자의 동적할당)가 저장, 메소드 호출이 끝나도 소멸되지 않음
- 데이터(data) 영역 : 전역변수/정적변수 저장, 프로그램이 시작될때 할당되고 프로그램이 종료되면 소멸
- 코드(text) 영역 : 실행할 프로그램의 코드가 저장
어랏? 한번 정리한적이 있었다. 이건 자바의 메모리구조였나..?ㅎ
https://pearlluck.tistory.com/10
위의 메모리 구조를 알았으니
이제 어떻게 메모리를 할당되는지를 이해하면 조금더 효율적인 코드작성에 도움이 될 것 같다.
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는 힙 메모리에 있는 객체를 참조하는형태로 동적할당을 알아서 해준다.
interpreter가 포인터를 사용해서 힙 메모리 영역의 범위를 조정하고,
자동으로 OS로 할당하지 않고 저장하고 있다가, 메모리가 필요할때마다 그때그때 할당한다.
이렇게 OS랑 소통하면서 결과값이 리턴되거나 변수와 함수의 사용이 멈추었을때 메모리가 소멸된다.
파이썬에서 '모든 객체'들이 '자동'으로 'heap영역'에 저장된다.
3. 결론 : 자바와 파이썬의 메모리 할당 방식 차이점
자바에서 static method는 데이터영역에 저장된다.
무분별한 static사용은 비효율적인 메모리 사용의 원인이 될수 있어, 사용자가 직접 메모리를 관리해야한다.
파이썬에서는 static method던 class method던 모든 객체들이 heap영역에 저장된다.
내부에서 효율적으로 메모리를 쓸 수 있도록 자동으로 동적할당을 해줘서, 사용자가 직접 메모리를 관리할 필요가 없다.
(뿐만 아니라 staic method는 일반 method 보다 메모리를 더 적게 차지한다!)
참고한 자료 및 출처
https://jay-ji.tistory.com/105
같이 보면 좋을 자료
파이썬 메모리구조 및 할당방식 https://woochan-autobiography.tistory.com/867
동적할당과 정적할당 https://deepwelloper.tistory.com/130
'🌱 Computer Science > Programming' 카테고리의 다른 글
🧐 파이썬 코드를 잘 짜는 법 : 병렬처리 라이브러리 비교분석 (3) | 2022.09.30 |
---|---|
🧐 파이썬 코드를 잘 짜는 법 : 의존성 주입(dependency injector) (0) | 2022.08.08 |
[Git] 실무에서 은근히 유용한 git stash와 git squash (1) | 2022.07.10 |
[Git] merge말고 rebase를 사용해야하는 이유, Rebase vs Merge (1) | 2022.05.29 |
[Test] mypy로 python 타입 검사하기 (0) | 2022.03.24 |
[Test] python 테스트코드의 필요성(feat.pytest) (0) | 2022.03.23 |