개념
- 사전적 의미로 '아무렇게나 쌓은 더미'
- 프로그래밍 환경에서 원시 자료형이 아닌 보다 큰 크기의 데이터를 담기 위한 동적 할당 메모리 공간
- 객체와 배열이 생성되는 영역
- C나 C++ 등에서는 힙 메모리 할당 후 명시적으로 해제해 주어야 메모리 누수가 발생하지 않음
- C#의 경우 GC ( Garbage Collection )가 메모리 해제를 해주지만 GC 호출 시점에 따라 성능 저하가 발생할 수 있음
(new 연산자를 통해 동적 할당. C#의 경우 기본적으로 클래스, 인터페이스 형식의 인스턴스는 모두 동적 할당)
- 보통 전역변수나 레퍼런스 타입이 힙 영역에 할당
(class,interface, delegate, object, string)
- 프로그램이 실행될 때까지 알 수 없는 가변적인 양의 데이터를 저장하기 위해 프로그램의 프로세스가 사용할 수 있도록 미리 예약되어 있는 메인 메모리의 영역으로 프로그램들에 의해 할당되었다가 회수되는 작용이 되풀이함
*원시 자료형
- 프로그래밍 언어가 제공하는 자료형 중 하나. 내장형 또는 기본형으로도 불림
- 정수, 실수, 문자 같이 간단한 형태로 구성되는 정보를 정의하는 자료 유형
- 자료형 중에서 가장 기본이 되는 자료형들
- 언어에 따라서 원시형의 범위가 다를 수 있다.
(C에서 문자열은 조합형, 자바스크립트에서는 기본형으로 취급)
*string에 대한 이야기
- string은 new를 사용하지도 않는데 왜 레퍼런스 타입인가 싶겠지만 string의 정의를 따라가보면
문자열을 저장할 수 있는 class 타입으로 즉, 레퍼런스 타입이 맞다.
- int나 float의 정의를 따라가보면 struct로 되어 있다.
string str = "abc";를 선언해보고 사용해보자
str[0] : 'a'
str[1] : 'b'
str[2] : 'c'
로 구성된다.
"abc"는 문자열 상수이기 때문에 str가 abc의 첫주소를 가리킨다.
문자열 상수 "abc"가 이미 객체이기 때문에 new가 필요 없다.
그러나, 다른 클래스나 인터페이스 등은 새로 객체를 만들어줘야 하기 때문에 new로 객체 생성을 해서 힙 메모리에 할당한다.
*class에서 스택 메모리와 힙 메모리
class TestClass tc;가 있다고 가정하자
tc : 스택 메모리에 할당 (이 때 참조값은 null)
tc = new TestClass; : 힙 메모리에 할당
(이 때 객체가 생성. 스택 메모리에 참조값(해시코드)이 할당된다)
(이 부분에 대해서는 참조타입 공부 정리 시 자세히..)
참고자료
https://ko.wikipedia.org/wiki/%EC%9B%90%EC%8B%9C_%EC%9E%90%EB%A3%8C%ED%98%95
'프로그래밍 > 기본기ㆍ자료구조' 카테고리의 다른 글
DeQueue (데큐,데크) (2) | 2020.04.14 |
---|---|
Priority Queue (우선순위 큐) (0) | 2020.04.14 |
stack (스택 메모리) (0) | 2020.04.14 |
Generic (제네릭) (3) | 2020.04.12 |
Deadlock (데드락) (0) | 2020.04.12 |