Stack과Heap 그리고 기본자료형 복합자료형

hyo·2021년 10월 19일
0
post-thumbnail

기본 자료형(원시자료형)과 복합 자료형(참조자료형)

현대의 프로그래밍언어에서 사용할수 있는 자료는 크게 두가지로 구분을 할 수 있다.
바로 기본 자료형과 복합 자료형이다.

복합 자료형은 기본 자료형보다 훨씬 크다.
기본 자료형은 스택(Stack)이라는 곳에 저장을 하고, 복합 자료형은 힙(Heap)이라는 곳에 저장을 한다.
스택(Stack)은 차곡차곡 쌓는다 라는 의미이고, 힙(Heap)은 아무렇게나 쌓아둔것을 의미를 한다.
스택(Stack)힙(Heap)은 메모리의 저장공간을 나타내는 것이다.

스택(Stack)에는 기본 자료형은 직접적으로 저장됨,복합자료형은 그 주소만 저장됨.
힙(Heap)에는 복합자료형 본체가 저장됨.

그림에서 보시다시피 스택(Stack)에는 작은자료들이 쌓이는 형태로 구성이되고, 힙(Heap)에는 아주 큰 자료들이 대충 널브러져 쌓이는 형태라고 생각하면 이해하기 쉽다.


변수 상자와 상수 상자

우리가 변수 or 상수를 선언하는것은, 스택(Stack)에 있는 상자에다가 이름을 붙여준다는 의미이다.

기본자료형인 숫자인 a = 10 을 넣어준다면, 스택(Stack)에 있는 상자안에 10을 넣어주고 그 상자의 이름을 a 라고 지어주는 원리이다.
문자열인 b = '안녕' 을 넣어줄수도 있다. 사실 문자열은 훨씬 복잡하게 처리 되지만 거기까지 아직은 알진 않아도된다.

하지만 배열은 굉장히 커서 스택(Stack)에는 넣을수가 없다.
그렇다면 c = [1, 2 ,3] 이라는 배열을 만들어서 넣는 코드는 어떻게 동작할까?
힙(Heap)의 공간안에 [1, 2, 3]이 저장이 되고, 컴퓨터 내부에서 그 공간의 주소를 임의로 #1 이라고 할때, 그 주소값 #1을 스택(Stack)상자에 넣고 그 스택(Stack)상자에 c라는 이름을 붙여주게된다.
주소는 어떤 데이터가 존재하는 위치이다.
아래에 이해하기 쉽게 그려봤다.

여기서 console.log(c)를 실행시켜보면, 스택(Stack)에서 c라는 공간에 있는 내용을 확인하고, 이게 어떠한 위치(주소)를 나타내는 값이기 때문에 힙(Heap)에서 이 위치에 있는 배열을 찾아와서 출력을 해주게된다.

아주 옛날 프로그래밍 언어, 사실 C언어 까지만 가도 console.log(c)를 하면 그냥 #1 이라는 주소를 출력을 한다.
하지만 이렇게 위치(주소)를 노출하고 조작할 수 있게하는 만드는 것은
굉장히 컴퓨터 내부적으로 위험할 수 있는 처리이기 때문에 현대적인 프로그래밍언어들은 이 위치(주소)를 아예 노출하지않고, 그냥 c 를 사용을 할때 스택(Stack)상자 c 내부에 주소가 들어있다면 힙(Heap)에서 그것을 가져와 사용을 하게 된다.

이때 스택(Stack)에있는 주소가 힙(Heap)에있는 주소를 가리키는 과정을 '레퍼런스한다'라고 부른다. 그리고 c 라는 변수는 레퍼런스가 들어있는 변수 이기 때문에 '레퍼런스 변수'라고 부른다.
스택(Stack)에도 주소가 있을수 있는데 그건 크게 활용 되지않으므로 신경을 안써줘도 된다.


기본자료형(원시자료형),복합자료형(참조자료형)예시로 알아보기

아래 코드를 보며 잘 이해해본다.







내용 정리

자료는 크게 기본자료형,복합자료형으로 구분

기본자료형(숫자,문자열,불)은 작고, 복합자료형(배열,함수, 객체)은 크다

Stack 과 Heap은 메모리의 저장 공간

기본자료형은 Stack에, 복합자료형은 Heap에 저장된다.

Stack에는 기본 자료형은 직접적으로 저장됨,복합자료형은 그 주소만 저장됨

Heap에는 복합자료형 본체가 저장됨

Stack에있는 어떠한 변수가 Heap에 있는 자료를 가리키는 행위를 '레퍼런스 한다', 이러한 주소값이 들어있는 변수를 '레퍼런스 변수' 라고 부른다.

profile
개발 재밌다

0개의 댓글