시작하세요 C# 프로그래밍 챕터 3장 C# 기초 정리한 내용
닷넷 변수 종류 (크게 2가지로 나뉨)
- 값 형식 (Value Type)의 변수, 참조 형식(Reference Type)의 변수
값/참조 형식의 차이를 이해하기 위해서는 스택(Stack)과 힙(Heap)의 이해가 필요하다
윈도우 프로그램은 기본적으로 하나의 스레드를 갖는다
그리고, 개별 스레드마다 전용으로 사용할 수 있는 저장소가 메모리에 할당되는데,
이러한 영역을 스택이라고 한다
반대로, 힙은 프로그램에 필요에 의해, 메모리를 요청할 때 사용할 수 있는 저장소다
닷넷에서는 CLR(Common Language Runtime)이 직접 힙을 관리한다
메모리를 사용한 후에는, 더이상 사용하지않는 다는 표현이 필요한데, 할당만 받고 해제를 하지않으면
메모리에 빈자리가 없어 프로그램 실행 중 오류가 발생하게 되기 때문이다
개발자가 스택에 변수를 선언하는 것 만으로, 스택 내의 특정 메모리 영역을 사용할 수 있게
C# 컴파일러가 자동 할당과 해제를 해준다.
따라서 스택의 메모리를 할당하고 해제하는것은 직접 하지않아도 된다
하지만 힙에 메모리를 할당하는 것은, 개발자가 명시적으로 요청한 것이므로 해제하는 과정이 필요하다
이러한 해제 과정에서 네이티브 환경과 관리 환경이 구분된다
기존의 네이티브 환경에서는 C/C++ 에서는 메모리 할당과 해제를 반드시 처리해주어야 했는데
C#은 개발자는 오직 할당만 하고 해제는 관리 환경 내의 특정 구성요소가 담당해준다
이러한 것을 가비지 수집기 (Garbage Collector)라고 한다
값 형식을 가리키는 변수
값 형식 변수는, 값 자체가 스택 영역에 할당되고 변수는 그 메모리를 가리킨다
값 형식 : sbyte, byte, char, short, ushort, int, uint, ulong, float, double, decimal, bool
참조 형식을 가리키는 변수
변수 값을 담기 위해 힙 영역을 추가로 할당한 다음, 스택에서 그 힙의 주소를 가리킨다
참조 형식 : string, class, object
번외)
값을 할당하지 않은 string 변수 (참조 형식 변수) 는 어떤 값을 가질까?
string text;
위 처럼 값을 할당하지 않은 경우, 스택 변수는 0을 담고 있다
= 가리킬 수 있는 힙 주소가 없는 경우이다
하지만 참조형 변수에 숫자 0을 대입할 수는 없어서 C# 은 null 예약어를 사용한다
아스키코드 0이 null이기 때문인듯
string text1;
string text2 = null;
따라서 위의 2가지 선언 모두 스택변수에 숫자 0을 갖고있다
추가로, 더는 사용되지 않음을 명시하기 위해 null을 할당하기도 한다
string name = "C#";
name = null;
값 형식과 참조 형식의 차이점
- 값을 스택에 저장하는지, 힙에 저장하는지
- 변수의 값을 다른 변수에 대입한 경우 메모리의 표현 방법
- 기본 값
스택 저장과 힙 저장
값 형식은 변수 타입에 해당하는 값을 스택에 저장하지만,
참조 형식은 그 값을 담기 위해, 별도로 힙 영역의 메모리를 할당하고,
스택의 변수 값은 다시 힙의 데이터 주소를 가리키게 한다
변수에 대입 시 메모리 처리
int n1 = 5;
int n2 = n1;
Console.WriteLine(n1); // 5
Console.WriteLine(n2); // 5
string txt1 = "C#";
string txt2 = txt1;
Console.WriteLine(txt1); //C#
Console.WriteLine(txt2); //C#
출력은 n1, n2가 같고 txt1, txt2가 같지만
값 형식과 참조 형식에 따라 메모리 표현 방식이 다음과 같이 다르다
값 형식인 n1, n2의 경우 동일한 값이 다른 스택 영역에 복사되었지만
참조 형식인 txt1, txt2는 같은 힙 영역을 다른 스택영역에서 가리킨다
기본 값
값 형식 변수는 무조건 메모리가 할당되므로 메모리 영역에 필연적으로 기본 값(default value)을 갖게된다
닷넷은 자료형에 메모리를 할당하면 값을 무조건 0으로 초기화 시키며
참조 형식의 경우 모두 null 값을 가진다
bool result; // result에는 false 값이 기본값으로 지정된다
int n; // n에는 0이 들어있다
string txt; // txt에는 null 값이 지정된다
참고 :
'C#' 카테고리의 다른 글
[Windows] 배치파일, cmd에서 한글 깨질 때, 인코딩 하는법 (0) | 2022.12.07 |
---|---|
[C#] 윈도우에 설치된 폰트 목록 가져오는법 (feat.폰트 저장 위치) (0) | 2021.12.06 |
[C#] 파싱해온 문자열, 특정 단어 기준으로 자르기 (feat. 형변환) (0) | 2021.11.26 |
[C#] 현재 .NET SDK에서는 .NET 6.0을(를) 대상으로 하는 것을 지원하지 않습니다. 해결법 (0) | 2021.11.23 |
[C#] .net sdk 설치 유무 및 버전 확인 하는법 (2) | 2021.11.23 |
[C#] 윈도우 cmd로 컴파일하는 csc.exe 파일 위치 찾는법 (0) | 2021.10.24 |