class가 기본 단위
필드(변수), 메소드(함수) 등 프로그램 구성 요소는 class 내부에 정의되야 함
Main()을 통해 시작, static 필수, 반환값 자유
System이라는 namespace의 Console class의 WriteLine 메소드
using을 사용해서 namespace 사용 가능
Read() : 한글자 읽기
ReadLine() : 한줄 읽기
Write() : 문자열(스트링) 출력
WriteLine() : 문자열 + 개행 출력
bool, byte, sbyte, char, decimal, double, float, int, long, short 등
byte의 경우 양수값만 가능, sbyte가 음수도 가능
int.MaxValue, int.MinValue 지원
int.Parse() 지원
128 bit, 고정소수점(28bit가 지수인것 같은데 정확한 계산법은 모르겠음), 접미사 m
28~29자리 정밀도
float은 7자리, double은 15~16자리 정밀도
단, float이나 double은 더 크고 작은 범위 표현 가능
c++의 auto
utf-16 지원, 한글 변수 가능
System.String의 alias
@"\t"와 같이 @를 붙이면 Escape Suquence 무시(단 raw랑은 다름)
void func(params type[] arr)
params keyword 사용
c#에서는 데이터 손실이 발생하는 암시적 형변환을 허용하지 않음
void func(out type var)
func(out var);
함수 사용시 keyword 명시 필수
reference + const
reference + 함수 내부에서 값 수정 필수
실수 자릿수까지 나머지 연산
실수를 0으로 나눌때는 무한대 판정
정수를 0으로 나눌때는 예외 발생
checked
{
try
{
int a = int.MaxValue;
a += 1;
}
catch(Exception e) { ... }
}
checked keyword 사용(default unchecked), overflow exception 발생
(long to int같은)casting에서도 감지 가능
Decimal은 checked를 사용하지 않아도 overflow와 DivideByZero exception 발생
string s = "abc";
s = "def"; // 새로 객체 생성
Immutable한 객체
string s = "abc";
s[1] = 'd'; // 불가능. Immutable
대신 replace를 지원하지만 역시 새 객체를 반환
string.Empty; // "" 객체
mutable한 객체
중괄호 {}으로 Format index 표현
{index[,alignment][:FormatString]}으로 표현
string.Format()에서는 중괄호 자체를 사용하기 힘듬
Format 지정법
형식 + 정밀도
돈, e 표현, 백분율, 3자리간격 ',' 등 지원하는게 많음
Custom 형식 지정자도 가능한데 좀 복잡한 듯
문자열 자체에 매개변수를 삽입한 느낌
$"{variableName}"을 통해 Format과 비슷한 효과
variableName은 미리 선언되어 있어야 함
enum형
string간의 문자열 비교 조건으로 사용
class 또는 namespace안에서만 선언 가능
enum EnumName { var1, var2 };
EnumName.var1;
'.'을 이용해서 접근
Enum.GetValues(typeof(EnumName));
Enum.GetNames(typeof(EnumName));
foreach(var iter in Enum.GetValues(typeof(EnumName))) { ... }
위 함수를 이용해 반복문을 통해 접근 가능
암시적 int casting 불가능
선언 시 할당, 컴파일 타임
ClassName.VariableName으로 접근
instance 생성 시 할당, 런타임
InstanceName.VariableName으로 접근
c#에서는 Initializer List가 없음
그냥 생성자 정의에서 바로 할당하는 구조인 듯
데이터를 heap에 저장하고 그 주소만 스택에 저장하는 객체
Object, string, array, dynamic, class, interface, delegate
int, double, float 등은 Value type(stack에 바로 데이터가 저장됨)
string은 reference type으로 heap에 데이터가 저장되지만 Immutable한 객체로 만약 매개변수로 string을 넘기고 매개변수를 수정한다면 지역변수로서 값이 수정되고 매개변수로 넘어간 원 변수는 변경사항이 없음
그러므로 만약 string을 reference한 매개변수로 사용하고싶다면 ref keyword필요
ptr != null && ptr.func()
ptr?.func()
value type, reference type 구분없이 자동으로 초기화 시켜주는 함수
Generic(Template)으로 생성된 객체들의 변수를 초기화시 사용하기 유용함
int? = Nullable<int>
Value type에 null이 가능해진다
Value type의 pointer용도로 사용하는 느낌
Nullable<int> var;
int x = var ?? 1; // var가 null일 경우 1 대입
값 비교 시 Compare()사용. <같은 비교구문은 ==, != 이외에는 모두 false
DB의 column 중 null이 가능한 column처리 시 유용
Nullable<int> var;
var.Value;
var.GetValueOrDefault();
Value로 접근할 경우 InvalidOperationException발생 가능
c#의 모든 객체는 Object를 상속
값 -> Object로 casting을 Boxing
Object -> 값으로 casting을 Unboxing
switch의 case문은 무조건 break를 통해서만 종료
switch의 본문이 없다면 중첩은 가능하지만 본문이 존재한다면 break없이 타고 넘어가는건 불가능