변수와 객체와 메모리의 관계! 자바를 예로 들어 변수와 객체는 메모리에 어떻게 저장되는지 정말 쉽게 설명해요!

KIM YONG GU·2023년 9월 2일
0

쉬운코드

목록 보기
2/18

왜 이 영상을 봐야 하나요?

애플리케이션이 실행될 때 객체를 포함하여 데이터가 메모리에 어떻게 저장되는지 알아야 개발 중에 실수하지 않을 수 있고 애플리케이션의 성능과도 어떻게 연관있는지 이해할 수 있기 때문입니다.

애플리케이션은 어떻게 실행되는가?

  • 애플리케이션 : 일반 사용자가 사용할 기능을 제공하는, 컴퓨터가 실행할 수 있는 명령어들의 집합
  • 메모리 : 실행된 어플리케이션이 상주하는 곳
  • CPU : 명령어를 실행하는 주체
  • runtime : 실행과 연관된..

메모리 구조

  • 애플리케이션에 할당되는 메모리는 내부적으로 여러 영역으로 나뉨
  • 그 중에 stack 메모리와 heap 메모리가 있음
  • stack 메모리 : 함수나 메서드의 지역 변수 (local variable)와 매개 변수(parameter)가 저장됨. 함수나 메서드가 호출될 대마다 스택 프래임(stack frame)이 쌓임
  • heap 메모리 : 객체가 저장됨

스택 메모리의 개념

  • 스택 메모리는 객체가 저장되는 메모리영역임
  • 매개 변수(args 등)와 지역 변수(기타 사용자정의 변수 a,b,c)의 의미를 잘 기억해 달라고 함
  • 스택 메모리에 스택 프레임을 어떻게 쌓이고, 어떻게 사라지는지 살펴보라고 함


스택 메모리의 특징

  • 스택 메모리에서는 메모리 관리가 함수 호출과 종류에 따라서 자동적으로 스택 프레임이 생겼다가 사라짐
  • 스택 메모리 영역을 개발자가 딱히 관리해 줄 필요가 없음
  • 다만, 스택 메모리가 너무 많이 쌓이면 애플리케이션이 죽어버림 (재귀함수나 재귀메소드를 사용할 경우 이런일이 발생함)

카운터 객체의 주소 값 (영상 9:30~19:30)

  • 객체를 담을 수 있는 변수를 만드록 정확히 말하면, 카운터 객체를 담는 것이 아니라 카운터 객체를 가리키게 됨 (heap 메모리)
  • 암묵적으로 숨겨진 this 변수가 존재함 (음?)
  • 카운터 객체를 가리키게 되면 이 변수 c에 저장되는 값이 그 자체가 아니라 주소 값이 저장된다고 보면 됨
  • 카운터 객체를 2라는(?) 메서드의 파라미터로 전달하고 나서 get을 호출했을 때 어떤 값이 반환되는지 주목할 것


Garbage 컬렉터의 동작

  • 쓰레기 객체(garbage object)는 접근할 수 없는 객체를 의미함 (사용되지 않고 생성된 객체들)
  • 프로그래밍 언어에 따라서는 접근이 불가능한 객체를 처리해 주는 방법이 있음. 개발자가 직접 처리하거나, 또는 프로그램에서 지원함. 그것이 Garbage 컬렉터임.
  • Garbage 컬렉터(GC)가 어떻게 동작하는지에 따라서 애플리케이션 성능에 영향을 미치기 때문에 지시도 잘 파악하는 게 중요함

파이썬의 객체 표현

  • 파이썬에서는 모든 것이 객체로 표현됨

From CHAT GPT

메모리 관리는 프로그래밍에서 중요한 주제 중 하나입니다. 프로그램이 데이터를 저장하고 처리하는 데 사용하는 두 가지 주요 메모리 영역인 스택(Stack)과 힙(Heap)에 대해 설명하겠습니다.

스택 (Stack):

정적 메모리 할당: 스택은 정적 메모리 할당 영역으로, 주로 메서드 호출과 관련된 데이터를 저장하는 데 사용됩니다. 각 함수(메서드) 호출 시 스택 프레임이 생성되며, 이 프레임에는 해당 함수의 로컬 변수, 매개변수, 반환 주소 등이 저장됩니다.
LIFO (Last-In-First-Out): 스택은 후입선출(LIFO) 원칙을 따릅니다. 가장 최근에 추가된 데이터가 가장 먼저 제거됩니다.
데이터 크기 고정: 스택은 크기가 고정되어 있으며, 컴파일 시점에 결정됩니다. 이로 인해 메모리 낭비가 발생하지 않습니다.
빠른 접근: 스택은 메모리 할당 및 해제가 빠르며, 데이터 접근 시간이 짧습니다.
주로 함수 호출 및 로컬 변수와 같이 데이터의 범위와 생존 기간이 제한된 데이터를 저장하는 데 사용됩니다.

힙 (Heap):

동적 메모리 할당: 힙은 동적 메모리 할당 영역으로, 프로그램 실행 중에 데이터를 저장하는 데 사용됩니다. 힙은 메모리를 동적으로 할당하고 해제할 수 있으므로 데이터의 크기와 생존 기간이 유연합니다.
데이터의 크기 다양: 힙은 데이터 크기가 다양하며, 데이터의 크기를 런타임에 결정할 수 있습니다.
수동으로 할당 및 해제: 힙에서 메모리를 할당하고 해제하는 작업은 프로그래머가 수동으로 수행해야 합니다. 메모리 누수를 방지하기 위해 주의가 필요합니다.
데이터 접근 시간 상대적으로 느림: 스택에 비해 데이터에 접근하는 데 시간이 더 오래 걸립니다.
주로 동적으로 생성된 객체, 배열 및 데이터 구조를 저장하는 데 사용됩니다.

요약하면, 스택과 힙은 다른 목적을 가진 두 가지 메모리 영역입니다. 스택은 정적 메모리 할당에 사용되며 주로 함수 호출과 관련된 데이터를 저장합니다. 반면에 힙은 동적 메모리 할당에 사용되며 데이터의 크기와 생존 기간이 유연하며, 객체와 데이터 구조를 저장하는 데 주로 사용됩니다. 개발자는 언제 어떤 메모리 영역을 사용할지 신중하게 결정해야 합니다.

profile
Engineer, Look Beyond the Code.

0개의 댓글

관련 채용 정보