안녕하세요 도쿄 정대리입니다. 오늘은 기술면접에서 자주 듣게 되는 질문인 힙과 스택의 차이에 대해서 이야기해보도록 하겠습니다. 힙과 스택에 대해서 어렴풋이 개념만 알고 있었다면 이번 포스팅을 통해서 자세히 알게 되는 계기가 되었으면 좋겠습니다.
메모리 구조
메모리 구조를 간단히 그림으로 나타내면 위 사진과 같습니다. 프로그램을 실행시키면 운영체제는, 실행한 프로그램을 위해서 메모리 공간을 할당해 주게 되는데요. 이때 할당되는 메모리의 공간이 크게 스택, 힙, 데이터 영역으로 나누어지게 됩니다. 할당되는 장소는 메인 메모리(RAM)에 할당되며, 할당되는 용도는 프로그램 실행 시 필요한 메모리 공간을 지정하기 위해서 할당되게 됩니다.
데이터 영역
위 사진상의 코드는 int 형 변수 a,b는 프로그램 실행 시에 int형 함수 main이 호줄되기 전에 데이터 영역에 할당되게 됩니다. 그래서 프로그램이 종료될 때까지 메모리상에 존재하게 됩니다. 이것이 전역 변수가 프로그램이 종료될 때까지 존재하는 이유입니다.
스택 영역
스택 영역에 저장되는 변수는 함수 호출시에 생성이 되며, 함수 호출이 완료되면 사라지게 됩니다.위의 그림으로 보면 변수 a, b는 데이터 영역에 저장되며 main 메서드안에 존재하는 int i, void fct1 메서드 안에 있는변수c,d 그리고 void fct2 메서드 안에 존재하는 변수 e,f가 스택영역에 저장되게 됩니다. 스택이라는 이름과 같이 데이터를 건초더미처럼 쌓아 올려놓는 역할을 하게 됩니다.
힙 영역
데이터 영역과 스택 영역을 위에서 알아보았습니다. 두 가지만 있으면 문제없이 코드를 짤 수 있을 것 같습니다. 그럼 힙 영역은 무엇을 위해서 필요한 것일까요? 제일 처음 사진에서 힙 영역은 프로그래머가 할당한다고 적혀있는데요. 그럼 언제 할당을 하는지 알 필요가 있습니다.
보통 배열을 선언할 때 상수로 선언을 하고는 합니다. 스택 영역에 할당될 메모리의 크기는 컴파일 타임에 결정됩니다. 정상적인 배열 선언이라면 arr배열의 크기가 40byte라는 것을 확인할 수 있습니다. 하지만 배열의 값을 동적으로 처리할 때에는 메모리의 값을 알 수 없습니다.
JAVA에서는 가비지 컬렉터를 통해서 자동으로 관리되는 영역입니다. 가비지 컬렉터가 없으면 프로그래머가 직접 관리(할당/해제)해줘야 합니다. 보통 스택보다 큰 메모리를 할당받기 위해서 사용합니다.
데이터, 스택, 힙 영역 정리
각각의 영역을 간단하게 정리하면 아래와 같습니다.
데이터 영역(정적메모리)
- 프로그램이 종료될 때까지 지워지지 않을 데이터 저장.
- 대표적으로 전역 변수와 static 변수
- 상수도 저장
스택 영역(자동 메모리)
- 잠깐 사용하고 삭제하는 데이터 저장(지역변수, 매개변수)
- 해당 객체가 정의된 블록(스코프)을 벗어날 때 소멸
- 함수의 호출하는 위치도 저장.
- 힙보다 빠름
힙 영역(자유 저장소)
- 가비지 컬렉터가 없으면 프로그래머가 직접 관리(할당/해제)해줘야 함.
- 스택보다 큰 메모리를 할당받기 위해 사용
- 동적 메모리 할당 ( new /포인터)
- delete를 사용하여 해당 객체 메모리 반환
- 스택보다 느림
간단하게 면접에서 이 정도만 대답할 수 있어도 합격 확률은 훨씬 올라갈 것으로 생각됩니다. 그럼 여러분의 코딩이 더욱 즐거워지기를 기원하면서 마치겠습니다.
'비전공자 IT 이야기 > C#' 카테고리의 다른 글
기술 면접 STRUCT와 CLASS의 차이점은? (0) | 2022.06.22 |
---|
댓글