
부동소수점은 다양한 정밀도를 가지며 분모를 2의 거듭제곱으로 나타낼 수 있는 분수라면 2진 부동소수점 형식으로도 숫자를 정확히 나타낼 수 있다.
Decimal은 128비트 정밀도를 갖는 10진 부동소수점 형식을 제공해 주는 것을 말한다.
소스코드 내에서 상수 값의 표현을 리터럴 값이라고 한다. 리터럴 값을 사용하면 대입한 값을 보고 해당 형식을 찾아 출력해 준다. 리터럴 접미사는 대문자를 사용하며 해당 리터럴 값의 형을 지정해 준다.
C# 기본 형식이 부울 또는 조건 형식인 bool이다. 이는 조건문이나 식에서 true와 false 키워드를 사용해 참이나 거짓을 나타낸다. bool의 크기는 1바이트이다.
char 형식은 유니코드 문자 집합의 UTF-16 인코딩에서 작성한 가능한 값들 중 16비트 문자를 나타낸다. char은 16비트 부호 없는 정수와 동일한 크기이며 0에서 65535 사이의 값을 나타낸다.
역슬래시와 특수 코드의 조합이 구성한다. \n은 새 줄을 의미하고, \t는 탭을 나타낸다. 역슬래시가 이스케이프 시퀀스의 시작을 알리고, 더 이상 단순 역슬래시로 볼 수 없어 \를 사용해야 역슬래시 문자를 표시할 수 있다.
1개 이상의 유한한 연속 문자를 문자열이라 한다. C#에서 문자열 형식은 string이며, BCL 이름은 System.String이다. 예상치 못한 몇 가지 특수한 문자가 들어 있다. @라는 '축약 문자열' 접두 문자와 $ 접두 문자를 사용하는 문자열 보간이 있으며, 문자열 불변성이라는 특징이 있다. @ 기호를 문자열 앞에 사용해 역슬래시가 이스케이프 시퀀스의 시작으로 해석되지 않게 할 수 있다. 축약 문자열 리터럴의 결과는 해당 역슬래시 문자를 다시 해석하지 않는다.
문자열 보간 구문은 달러 기호를 문자열 접두어로 붙인 다음 중괄호 내에 식을 포함한다. System.Console.WriteLine($"Your full name is {firstName} {lastName}.");
Format() 메소드는 콘솔 창에서 해당 결과를 표시하지 않고 string.Format()으로 호출자에게 결과를 반환하는 경우를 제외하고 정확히 Console.Write()와 Console.WriteLine()처럼 동작한다.
예를 들어 price가 decimal 형식의 변수라면 string.Format("{0,20:C2}", price) 또는 동등한 보간 $"{price,20:C2}" 둘 다는 기본 통화 서식 규칙을 사용해 10진 값을 문자열로 변환하고, 소수점 이하 두 숫자를 반올림하고 20글자 문자열을 오른쪽 정렬한다.
문자열의 길이를 알려면 Length라는 문자열 멤버를 사용한다. 문자열의 길이를 직접 설정할 수 없다. 문자열에서 문자의 수로 길이를 계산한다. 더욱이 문자열은 변경할 수 없기 때문에 문자열의 길이는 변경하지 못한다. string 형식의 핵심 특징은 변경할 수 없다는 점이다.
여러 단계로 긴 문자열을 구성할 때처럼 문자열을 많이 수정해야 한다면 string보다는 System.Text.StringBuilder라는 데이터 형식을 사용해야 한다. StringBuilder 형식에는 Append()와 AppendFormat(), Insert(), Remove(), Replace() 같은 메소드가 있으며, 그중 일부는 string에서도 사용할 수 있다.
null 키워드로 구분하는 null 값은 해당 변수가 다른 유효한 객체를 참조하지 않을 때 사용하는 키워드이다. null은 리터럴 문자열 형식으로도 사용된다. 변수에 아무것도 설정되지 않았음을 가리킨다. null 값을 string 변수에 할당하는 것은 빈 문자열인 ""을 할당하는 것과 전혀 다르다.
void는 형식이 없거나 어떤 값도 전혀 존재하지 않을 때 사용하는 키워드이다.
모든 형식은 값 형식과 참조 형식이라는 두 가지 범주 중 하나에 속한다. 각 범주의 형식들 간의 차이점은 이들 형식이 복사되는 방식에 기인한다. 값 형식 데이터는 항상 값으로 복사되지만, 참조 형식 데이터는 항상 참조로 복사된다.
string 을 제외하고 지금까지 이 책에 나온 미리 정의된 형식은 모두 값 형식이었다. 값 형식으로 된 변수는 직접 값을 담는다. 다시 말해 변수는 메모리에서 해당 값이 저장된 동일한 위치를 참조한다.
값 형식과는 달리 참조 형식의 값은 데이터를 담고 있는 저장소 위치에 대한 참조다. 참조 형식은 값 형식처럼 데이터를 직접 저장하지 않고 데이터가 위치한 곳으로 참조를 저장한다. 참조 형식이 가리키는 해당 데이터의 메모리 영역을 힙이라 한다.
캐스트는 연산자를 사용해 형 변환을 하는 것을 말한다. 명시적 캐스팅은 정밀도와 데이터의 손실이 일어나거나 예외가 발생할 수 있음을 알고서 의도적으로 하는 행위이다.
암시적 변환은 예를 들어 int 형식에서 long 형식으로 변환과 같이 정밀도의 손실이 없으며, 해당 형식의 값에서는 근본적인 변화가 일어나지 않는다. 이런 경우 코드에서는 할당 ㅇ연산자만 지정해야 한다.
문자열에서 숫자 형식으로 어떤 변환도 정의돼 있지 않으므로, Parse()와 같은 메소드가 필요하다. 각 숫자 데이터 형식에는 문자열에서 해당 숫자 형식으로 변환할 수 있는 Parse() 함수가 포함돼 있다.
배열은 변수 한 개를 사용해 동일한 형식의 여러 항목을 저장할 수 있으며, 필요시 인덱스를 사용해 여전히 개별적으로 접근할 수 있다. 배열의 인덱스는 0에서 시작한다.
C#에서는 대괄호를 사용해 배열을 선언한다. 배열의 요소 형식을 지정한 후 이어서 대괄호를 나타내고 변수의 이름을 입력한다. string[] names;와 같은 형태로 작성한다. 배열의 첫 번째 부분은 배열 내의 요소에 대한 데이터 형식을 나타낸다.
배열이 선언되고 나면 중괄호 쌍 내에서 콤마로 분리한 항목의 목록을 사용해 바로 값을 채울 수 있다. 할당 구문은 한 문장 내에서 값을 선언하고 할당하는 경우만 사용한다. 선언 이후에 값을 할당하려면 new라는 키워드를 사용한다. 참조 형식은 null로 초기화되고, 숫자 형식은 0으로 초기화된다. bool은 false로 초기화가 되고 char는 \0으로 초기화된다.
3목 보드는 다차원 배열을 콤마를 통해 랭크의 크기를 분리하는 것으로 int[,] cells = int[3,3];과 같은 형식을 가진다. 3목 보드를 사용할 때는 각 요소끼리의 크기가 같아야 한다. 모든 행의 열의 개수가 같아야 한다. 만약 각 모든 행의 열의 개수가 다르게 할당하고 싶으면 가변 배열을 통하여 초기화를 할 수 있다.
가변 배열은 새로운 차원을 구분하려고 콤마를 사용하지 않는다. 가변 배열은 배열의 배열이라고 할 수 있다.
int[][] cells = { new int[]{1, 0, 2, 0}, new int[]{1, 2, 0}, new int[]{1, 2}, new int[]{1} };
BinarySearch는 정렬된 배열에서 검색 요소가 존재하지 않는다면 해당 값은 음수를 반환한다.
Clear은 배열의 요소를 제거하지 않으며 길이를 0으로 만들지 않는다. 배열의 크기는 고정이므로 변경될 수 없다.
Rank 멤버를 액세스하면 전체 배열의 랭크를 가져올 수 있다.
ToCharArray()를 사용하면 배열로 반환할 수 있다.
Reverse()는 해당 배열을 거꾸로 뒤집어준다.