
산술 연산자는 수치 형식의 데이터를 다루는 연산자입니다.
산술 연산자는 이름이 나타내는 것처럼 수치 형식에 대해서만 사용이 가능합니다.
다시말해 정수,부동소수점,decimal 형식에 대해서만 사용가능하다는 뜻입니다.

증가 연산자와 감소 연산자는 피연산자의 값을 1 증가 또는 감소시키는 일이 전부입니다.
증가 연산자의 기호는 ++ 감소연산자의 기호는 -- 를 사용합니다.
✍ 전위와 후위의 차이점
int a = 100;
Console.WriteLine(a++); //101이 아닌 100을 출력하고, 출력후에는 101로 증가
Console.WriteLine(++a); //102를 출력함
문자열 결합 연산자는 문자열을 합칠 수 있는 연산자입니다.
두 string 형식을 연결할 때 사용합니다.
string result = "123" + "456";
string result2 = "이것이 " + "C#이다.";
출력
123456
이것이 C#이다.
관계 연산자는 두 피연산자 사이의 관계를 평가하는 연산자입니다.
가령 두 피연산자가 같은지 또는 다른지, 한쪽이 다른 한쪽보다 큰지 또는 작은지등을 판단해줍니다.
bool result;
result = 3 > 4; //거짓
result = 3 >= 4; //거짓
result = 3 < 4; //참
result = 3 <= 4; //참
result = 3 == 4; //거짓
result = 3 != 4; //참
부울 연산이라고도 하는 논리 연산은 참과 거짓으로 이루어지는 진릿값이 피연산자인 연산을 말합니다.
C#에서 제공하는 논리 연산자는 논리곱(&& : AND),논리합(|| : OR),부정(! : NOT) 연산자가 있습니다.
논리곱 연산자는 피연산자로 오는 두 개의 진릿값이 모두 참이여야 그 결과가 참이 되고,
그 이외에는 모두 거짓이 됩니다.
True && True : True
True && False : False
False && True : False
False && False : False
논리합 연산자는 피연산자로 오는 두 개의 진릿값중 하나라도 참이면 연산 결과가 참이 됩니다.
True && True : True
True && False : True
False && True : True
False && False : False
부정 연산자는 피연산자의 진릿값을 반대로 뒤집습니다.
!True : False
!False : True
적절한 조건 연산자는 코드의 가독성을 향상합니다.
변수 = 조건식 ? 참때의 값 : 거짓일떄의 값
int a = 30;
string result = (a == 30) ? "삼십" : "삼십이 아님";
?.가 하는 일은 객체의 멤버에 접근하기 전에 해당객체가 null인지 검사하여 그 결과가 참(즉 객체가 null)이면 그 결과로 null을 반환하고, 그렇지 않은 경우에는 . 뒤에 지정된 멤버를 반환합니다.
== 연산자를 이용한 코드
class Foo
{
public int member;
}
Foo foo = null;
int? bar;
if(foo == null)
bar = null;
else
bar = foo.member;
?.연산자를 이용한 코드
class Foo
{
public int member;
}
Foo foo = null;
int? bar;
bar = foo?.member; //foo객체가 null이 아니면 member필드에 접근하게 해줌
1byte크기는 비트 8개를 담을 수있는 크기의 데이터 형식입니다.
비트 수준에서 데이터를 가공해야하는 경우가 종종 생깁니다.
예를 들어 비트 00000001을 00001000으로 바꾸고 싶을때는 원본데이터에 << 3을 하면 됩니다. 이런식으로 비트 연산자는 만들고싶은 비트를 조합할수있게하는 연산자입니다.
비트연산 활용하기
시프트 연산자
시프트 연산자는 비트를 왼쪽이나 오른쪽으로 이동시키는 연산자입니다.
시프트 연산자의 작동 원리
시프트 연산은 고속의 곱셈과 나눗셈을 구현하는데 사용되기도 하고,
&연산자와|연산자와 함께 byte처럼 작은 단위로 쪼개진 데이터를 다시 하나의 int나 long형식으로 재조립하는 데 사용되기도 합니다.
원본데이터를 a, 옮긴 비트 수를 b라고 하면,
<< 왼쪽 시프트 연산시

>> 오른쪽 시프트 연산시

이런 결과를 얻을 수있습니다.
✍ 입력
int a = 1;
Console.WriteLine($"a : {a}");
Console.WriteLine($"a : {a << 1}");
Console.WriteLine($"a : {a << 2}");
Console.WriteLine($"a : {a << 5}");
//증가,감소 연산자처럼 a를 직접적으로 증가시키는게 아니라 값을 리턴해줌+-*/87
💻 출력
a : 1
a : 2
a : 4
a : 32
비트 논리 연산자
논리곱(AND) 연산자 : 두 피연산자 비트에 대해 논리 곱을 수행합니다.
정수계열과 bool형식에 사용 할 수있습니다.
int result = 9 & 10; // result는 8
논리합(OR) 연산자 : 두 피연산자 비트에 대해 논리 합을 수행합니다.
정수계열과 bool형식에 사용 할 수있습니다.
int result = 9 | 10; // result는 11
배타적 논리합(XOR) 연산자 : 두 피연산자 비트에 대해 논리 배타적 논리합을 수행합니다.
정수계열과 bool형식에 사용 할 수있습니다.
int result = 9 ^ 10; // result는 3
보수(NOT) 연산자 : 피연산자 비트에 대해 0은 1로, 1은 0으로 반전 시킵니다. 단항 연산자입니다. int,uint,long,ulong에 사용할수 있습니다.
int a = 255;
int result = ~a; //result는 -256

null병합 연산자 ??는 null조건부 연산자처럼 프로그램에서 종종 필요한 변수/객체의null검사를 간결하게 만들어주는 역활을 합니다.
??연산자는 두 개의 피연산자를 받아들이고 왼쪽 피연산자가 null인지 판단합니다.
평가 결과가 null이 아닌 것으로 나타나면 왼쪽 피연산자를 그대로 반환하고, 만약 왼쪽 피연산자가 null인 것으로 평가되면 오른쪽 피연산자를 반환합니다.
✍ 입력
int? a = null;
Console.WriteLine($"{a ?? 0}"); //왼쪽 피연산자가 null이므로 0(오른쪽 피연산자)반환
int? a = 99;
Console.WriteLine($"{a ?? 0}"); //왼쪽이 null이 아니므로 99를 그대로 반환
💻 출력
0
99
C#연산자들 사이에도 우선순위가 존재합니다. 우선순위가 높을수록 빨리 처리하게 됩니다.
그리고 우선 순위가 같은 경우에는 왼쪽의 연산자가 오른쪽 연산자보다 우선순위가 높습니다.
( ※ 우선 순위는 1이 제일 높음)
