본문 바로가기
C#

C# 닷넷 기초 - 변수와 메모리의 이해2 : 값형식과 참조 형식(스택stack, 힙heap 메모리) / 개발자 기술 면접에서 꼭 나오는 질문

by 따봉이 2022. 1. 6.
728x90
반응형

오늘은 스택과 힙에 대해서 정리를 해보도록 하겠습니다. 

 

스택과 힙 메모리 전에 변수와 메모리 구조에 대한 간단한 정리는 이전글 참고해주세요.

https://ttleader.tistory.com/125

 

C# 닷넷 기초 - 변수와 메모리의 이해1 : 변수 (스택stack, 힙heap 메모리) / 개발자 기술 면접에서

오늘은 변수와 함께 메모리에 대해서 정리를 해보려고 한다. 먼저 프로그래밍에 없어서는 안 될 가장 많이 쓰고 가장 기본적인 것 바로 변수! 다 변수는 말 그대로 변하는 값인 것이다. int age = 19

ttleader.tistory.com

 

메모리는 스택영역과 힙영역이 있다. 이 두 메모리 영역이 어떻게 사용되는지를 이해하려면 메모리를 사용하는 데이터

들의 형식에 대해 이해를 해야한다. 형식은 값형식과 참조형식이 있다. 

 

1. 값형식

값형식은 데이터 값 자체가 스택 메모리 영역에 바로 저장이 된다. 

 

아래 나열한 것들이 값형식에 해당된다. 

sbyte, byte, char, short, ushort, int uint, uint, long, ulong, float, double, decimal - 숫자관련

bool - true/false

 

위의 자료형을 선언하게 되면 그 즉시 스택영역에 해당 공간만큼 메모리가 할당이 되고 값을 대입시키면 그 공간에

값이 들어가게 된다. 구조는 아래와 같다. 

 

int 값형식 메모리 할당과 저장

int는 값형식으로 메모리의 스택영역에 int에 맞는 4byte를 할당하게 되고 할당한 곳에 1이라는 값을 직접 저장하게 된다. 만약 선언만 하고 값을 대입하지 않으면 기본으로 0값이 들어가게 된다.  

다음은 참조형식에 대해 알아보자.

 

 

2. 참조형식

참조형식은 값형식과 달리 값은 힙영역에 저장하고 스택에는 힙영역의 주소값을 가지게 되는 것이 참조형식이다. 

 

아래 나열한 것들이 참조형식이다. 

string, 배열(Array), 클래스(Class), Object 

 

참조형식

위에 코드를 보면 string으로 name 변수를 선언하게 되면 메모리의 스택영역에 공간이 할당되고 그 스택영역에는

실제 "홍길동"이라는 값이 저장될 힙메모리의 주소값이 입력된다. 그리고 그 주소의 힙영역에 "홍길동"이라는 값이 들어가게 된다. 

 

위의 내용이 이해가 잘 가지 않으면 아파트를 예로 들어보자.

아파트로 예를 들자

가수라는 변수는 참조형식이므로 스택영역인 502호에 할당된다. 그리고 할당된 502호는 실제 가수의 이름을 저장하고 있는 힙영역인 201호의 주소값을 가지고 있고 201호에 "홍길동"이라는 값이 저장되게 되는 것이다. 

 

값형식은 변수를 선언만하고 값을 넣지 않으면 스택에 0으로 입력이 된다고 했다. 그럼 참조형식은 어떻게 될까? 참조형식은 선언만하게 되면 스택에 null 이라는 예약어가 저장되게 된다. 

 

참조형식 변수를 선언만 한 경우

 

참고로 변수는 선언하면 모두 메모리를 할당하게 되는데 이때 값을 대입하지 않은 선언만 한 상태에서도 메모리가 할당되기 때문에 할당된 메모리에 들어가게될 기본값이 들어가게 된다. 값형식은 모두 0으로 들어가지만 참조형식은 null로 들어가게 된다. 그 외 bool은 false가 기본값으로 들어가게 된다. 

 

이번 시간에는 값형식과 참조형식이 메모리의 스택영역과 힙영역을 어떻게 사용하는지 알아보았다.

다음은 스택과 힙에 대해 좀 더 심화있게 정리를 해보도록 하겠다. 

 

728x90
반응형

댓글