● 산술 연산자
연산자는 변수나 실제값에 해당하는 피연산자를 더하거나 곱하는 등의 연산을 수행하며 일반적으로 다른 변수에 할당 가능한 또 다른 값을 반환합니다.
연산자 중 이항 연산자는 연산에 필요한 피연산자가 최소 2개 이상은 되어야 하는 연산자임을 의미하며
int i = 10;
int j = 20;
int result = i + j;
가(+), 감(-), 승(*), 제(/) 연산을 위해서 가장 많이 사용되는 연산자입니다. 참고로 % 는 나머지를 의미합니다.
int i = 10;
int j = 20;
int result = i % j;
단항 연산자는 단 하나의 피연산자를 필요로 합니다.
int i = 10;
int result = ++i;
단항 연산자는 대표적으로 변수의 값을 1만큼 증가시키는 ++와 변수의 값을 1만큼 감소시키는 --연산자가 있으며 위 예제에서와 같이 사용할 수 있습니다.
int i = 1;
int r = i++;
//i : 2, r : 1
Console.WriteLine($"i : {i}, r : {r}");
그런데 예제를 보면 i의 값은 정상적으로 1만큼 증가하여 2가 되었는데 연산의 결과를 받은 r의 값은 여전히 1입니다. 이는 ++연산자가 변수의 뒤에 위치(후위 연산자)해 있기 때문에 변수 i의 값이 1 증가되기 전 r에 값을 할당하는 처리가 먼저 이루어졌기 때문입니다.
int i = 1;
int r = ++i;
//i : 2, r : 2
Console.WriteLine($"i : {i}, r : {r}");
반대로 ++연산자를 변수 i의 앞에 놓으면(전위 연산자) i의 값을 1증가시키는 처리가 먼저 수행되므로 결과는 i와 r모두 2가 됨을 알 수 있습니다. 이렇듯 ++나 혹은 --연산자가 어디에 위치해 있으냐에 따라 결과가 달라질 수 있으므로 주의해야 합니다.
삼항 연산자는 피연산자가 최소 3개 이상 요구되는 연산자입니다.
bool b = true;
bool result = (b == true ? true : false);
참고로 이전 예제들에서 할당연산자인 = 연산자를 사용했는데 코드의 간결화를 위해서 할당 연산자와 다른 연산자를 결합하여 사용할 수도 있습니다. 예를 들어 아래 예제의 경우 'i += 1;'은 i변수의 값에 1을 더한 뒤 그 결과를 다시 i변수에 할당하는 동작을 수행합니다.
int i = 10;
i += 1;
Console.WriteLine(i);
● 논리 연산자
논리 연산자는 기본적으로 Boolean값을 연산하며 그 결과를 true나 false로 반환합니다.
bool a = true;
bool b = false;
Console.WriteLine(a & b); //False
Console.WriteLine(a | b); //True
Console.WriteLine(a ^ b); //True
예제에서 &는 And연산을 의미하며 피연산자 모두가 True(1)이여야만 결과로 True(1)를 반환할 수 있습니다. 현재 b변수가 False(0)이므로 결과는 False(0)가 됩니다.
'|'는 OR연산입니다. 이 연산은 피연산자중 하나라도 True(1) 면 그 결과로 True(1)를 반환할 수 있습니다. 현재 a변수의 값이 True(1)이므로 그 결과는 True(1)가 됩니다.
^는 XOR연산입니다. 피연산자중 하나가 True(1)면서 다른 피연산자가 다른 값을 가진 경우 True(1)를 반환할 수 있습니다. 다시 말해 어느 한쪽이 True(1)인 경우(모두가 아닌)에만 결과가 True(1)가 됩니다.
논리 연산자를 bool이 아닌 일반적인 정수단위로도 수행할 수 있습니다. 이런 경우 논리 연산자는 비트 연산자로서의 동작을 수행하게 됩니다.
int i = 1;
int j = 3;
//1
Console.WriteLine(i & j);
이러한 경우 각 값의 비트단위의 연산이 이루어지게 되는데 위의 예제의 경우 i는 00000001고 j는 00000011이므로 이들 비트에 대한 &연산을 수행하게 되면
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
모두가 1(True)인 경우에만 1(True)되므로 결과는 1이 됩니다.
int i = 1;
int j = 3;
//00000001
Console.WriteLine(Convert.ToString(i, toBase: 2).PadLeft(8, '0'));
//00000011
Console.WriteLine(Convert.ToString(j, toBase: 2).PadLeft(8, '0'));
● 조건부 논리 연산자
조건부 논리 연산자는 논리 연산자와 매우 비슷하지만 연산자 자체를 하나대신 &&이나 ||처럼 2개를 사용하며 연산자의 동작에도 약간의 차이가 있습니다.
&와 |연산을 가만히 생각해보면 만약 &연산에서 처음 선행되는 피연산자의 값이 False(0)일 때는 무조건 결과는 False(0)가 될 것이므로 그다음 피연산자의 상태를 확인해볼 필요가 없게 됩니다. |연산도 마찬가지이며 처음 피연산자의 상태가 True(1)라면 결과는 무조건 True(1)가 될 것이므로 다음에 오는 피연산자의 상태 역시 판단이 무의 합니다.
bool a = false;
bool MyFunction()
{
Console.WriteLine("메서드 실행됨");
return true;
}
Console.WriteLine(a & MyFunction());
//메서드 실행됨
//False
위 예제의 경우 & 연산을 사용했는데 처음 피연산자의 상태와는 관련 없이 무조건 모든 피연산자의 상태를 확인하여 처리하게 되므로 '메서드 실행됨'이라는 메시지를 볼 수 있지만
Console.WriteLine(a && MyFunction());
//False
연산자를 &&으로 바꾸게 되면 선행되는 피연산자인 a의 값이 False(0)이므로 그다음에 오는 MyFunction()은 실행할 필요가 없게 됩니다. 따라서 'False'라는 결과만을 보게 될 것입니다.
● Shift 연산자
Shift 연산자는 일반적인 가, 감, 승, 제연 산자처럼 특정 값에 대한 산술 연산을 수행할 수 있습니다. 비록 개념적으로는 익숙하지 않지만 일반적인 산술 연산자보다 더 빠른 연산 수행이 가능합니다.
int a = 1;
//2
Console.WriteLine(a << 1);
Shift 연산자는 <<이나 >>로 사용될 수 있는데 <<연산자는 비트를 왼쪽으로, >>연산자는 비트를 오른쪽으로 지정한 수만큼 이동시키게 됩니다. 따라서 예제는 a의 비트인 00000001에서 왼쪽으로 1비트만큼 이동시키게 되므로 결과는 00000010이 됩니다.(이동하고 남은 자리는 0으로 채워지게 됩니다.)
● 기타 연산자
특정 데이터형의 타입이나 크기를 가져오는 다음과 같은 경우도 연산자에 포함될 수 있습니다.
Type t = typeof(int);
Console.WriteLine(t.ToString()); //System.Int32
int s = sizeof(int);
Console.WriteLine(s); //4
string n = nameof(DateTime);
Console.WriteLine(n); //DateTime
nameof는 변수나 Type, 멤버와 같은 개체에서 네임스페이스를 제외한 이름을 가져오는 연산자이며 sizeof는 Type의 바이트 단위 크기를 반환하는 연산자입니다.
이 밖에 기타 변수의 멤버에 접근할 때 사용하는 마침표(.)는 멤버 접근 연산자라고 하며 메서드나 함수 이름 뒤에 붙는 괄호(())는 호출 연산자(invocation operator), 배열 이름 뒤에 오는 대괄호([])는 인덱서 접근 연산자(indexer access operator)라고 합니다.
'.NET > C#' 카테고리의 다른 글
[C#] 형변환 (0) | 2022.06.24 |
---|---|
[C#] 흐름제어 (0) | 2022.06.24 |
[C#] C# 개요 - 3. 기타 Console Application 관련 (0) | 2022.06.24 |
[C#] C# 개요 - 2. 변수 (0) | 2022.06.24 |
[C#] C# 개요 - 1. C#의 특징및 개요 (0) | 2022.06.24 |