반응형

 

 

 

 

[리뷰] C#린이, 기본 참고서로 시작하세요 C# 프로그래밍 읽어봄

wpf, uwp를 c#과 xaml을 사용해서 만들어 본적은 있으나 사실 C# 기본적인 문법에 관해서는 많이 부족한 편이었다 기존에는 기능을 구현하기 위해 스택오버플로우의 글들을 많이 참고를 했으나 사실

studyingpingu.tistory.com

 

 

시작하세요 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;

 

 

 


 

값 형식과 참조 형식의 차이점

  1. 값을 스택에 저장하는지, 힙에 저장하는지
  2. 변수의 값을 다른 변수에 대입한 경우 메모리의 표현 방법
  3. 기본 값

 

스택 저장과 힙 저장

값 형식은 변수 타입에 해당하는 값을 스택에 저장하지만,

 

참조 형식은 그 값을 담기 위해, 별도로 힙 영역의 메모리를 할당하고,

스택의 변수 값은 다시 힙의 데이터 주소를 가리키게 한다

 

 

변수에 대입 시 메모리 처리

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 값이 지정된다

 

 

 

참고 :

 

기타: 34. 도서: 시작하세요! C# 프로그래밍: 기본 문법부터 실전 예제까지

 

www.sysnet.pe.kr

 

 

 

ASCII - 위키백과, 우리 모두의 백과사전

1972 프린터 사용 설명서에 개시된 아스키 코드 차트표 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( , 아스키)는 영문 알파벳을 사용하는 대표적인 문자

ko.wikipedia.org

 

반응형

+ Recent posts