- char c = '\u2023' 같은것도 가능
- 반대로 char \u2023 = 'c' 도 가능합니다. (char 빵 = '빵' 되듯이..)
- uint와 char는 바이트 크기는 같지만, uint는 수를 담기 위한 타입으로 정해져 있고 char는 문자를 담기 위한 타입으로 약속되어있습니다.
- 이 때문에, char에 사칙연산을 적용하려고 하면 오류가 발생합니다.
- string str = "\tHello World\n!"; Console.WriteLine(str); 이라 하면 콘솔에 'Hello World!"라고 뜨지만
- string str = @"\tHello World\n!"; 이렇게 하면 Escape Sequence를 따지지 않고 콘솔에 "\tHello World\n!"라고 뜹니다.
- 즉, 이스케이프 시퀀스로 간주하지 않고 순수한 문자로 취급할 수 있습니다.
- 예약어를 식별자로 사용할 수 없지만, 식별자로 사용해야 한다면 '@' 문자를 접두어로 사용하여 C# 컴파일러가 예약어가 아닌 식별자로 인식하게 할 수 있습니다.
- char int = 'a'; // int는 예약어라서 못쓰지만
- char @int = 'a'; // 이렇게하면 가능합니다.
- 논리형에는 bool이 존재하며, System.Boolean을 줄인 예약어 입니다.
- C#에는 값형식과 참조형식이 존재합니다.
- 값 형식(Value Type)은 스택(Stack)에 저장되고
- 참조 형식(Reference Type)은 힙(Heap)에 저장됩니다.
- 윈도우 프로그램은 기본적으로 하나의 스레드를 갖습니다. 이 때, 개별 스레드마다 전용으로 사용할 수 있는 저장소가 메모리에 할당되는데, 그 영역을 스택이라고 합니다.
- 힙은 프로그램에서 필요에 의해 메모리를 사용하겠다고 요청했을 때 사용할 수 있는 저장소로, 특별히 닷넷에서는 CLR이 직접 프로그램에서 사용될 힙을 관리한다.
- Heap에 저장된 데이터는 원래 자동으로 해제되지 않습니다. 하지만 C#에는 GC가 있으므로, 자동으로 할당 해제합니다.
- C#의 값형식은 정수형,실수형, char, bool, struct 등이 있습니다.
- C#의 참조형식은 배열, 클래스, string, object 등이 있으며, 값 형식과는 달리 변수의 타입에 해당하는 값을 별도의 힙 메모리를 할당하여 담고 스택의 변수 값은 그 힙의 데이터 주소를 가리키게 됩니다.
- int b; 이렇게 선언만 해놓고 초기화를 안하면 b에는 0이 들어갑니다. 하지만 C#은 오류로 판단하여 못쓰게 합니다. 따라서 int b = 0; 이런식으로 명시적으로 초기화를 하세요.
- C#에서는 항상 자료형에 대한 메모리를 할당하면 해당 영역을 0으로 초기화합니다. (bool형은 false)
- 상수는 const int b = 5; 이런식으로 합니다. 즉, 변수 정의시 const 예약어를 붙여줍니다.
- 상수는 반드시 컴파일 시에 값이 결정되어야 합니다.
- string s = "a"; 하게 되면 stack에는 's'변수가 할당되고, heap에는 실제 데이터가 할당됩니다.
- C#에서 참조형은 'new'키워드를 사용하여 할당합니다.
- 배열은 동일한 타입의 공간을 지정된 수만큼 힙 메모리에 연속적으로 할당합니다. 배열도 참조 타입이기 때문입니다.
- 한번 정해진 배열의 크기는 고정됩니다. 참조 변수의 특성상 가리키는 대상이 변할 수 있기 때문에 변경된 크기의 배열을 다시 가리키는 것은 가능하나, 처음에 있었던 배열의 크기가 변경되는 것은 아닙니다.
- 배열을 선언하는 경우 기본적으로 모든 값은 타입에 따른 초기화 값을 갖습니다. 즉, 값 형식 배열일 경우 기본값인 0에 준하는 값을 가지며 참조 형식 배열이라면 개별 요소가 null로 초기화가 됩니다.
- 배열
int[] arr1 = new int[5] { 0, 1, 2, 3, 4 }; // 배열의 수를 명시적으로 지정했으므로 초기화 시 반드시 그 수만큼 요소를 나열해야 한다.
int[] arr2 = new int[] { 0, 1, 2, 3, 4 }; // 컴파일러가 배열의 수를 자동으로 계산한다.
int arr[2][3] (C style)
int[][] arr = new int[2][3]; (Java style)
int[,] arr = new int[2,3]; (C# sytle)
// 이것도 가능하겠죠?
int[,,] arr2 = new int[2, 3, 4]
{
{ { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } },
{ { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } }
};