1. 연산자(Operators)
C#에선 산술 연산자, 증감 연산자, 조건 연산자, 관계 연산자, 논리 연산자 등 여러 가지의 연산자를 제공합니다. 오늘은 아래 표에 정리된 연산자들에 대해서 배워보도록 하겠습니다.
분류 |
연산자 |
예 |
수식 연산자 |
+, -, *, /, % |
a = b + c; |
증감 연산자 |
++, -- |
a++; |
할당 연산자 |
=, +=, -=, *=, /=, %= |
a += b + c; |
논리 연산자 |
&&, ||, ! |
a && b |
관계 연산자 |
<, >, ==, !=, >=, <= |
a > b |
비트 연산자 |
&, |, ^ |
a ^ b |
시프트 연산자 |
>>, << |
a >> 2 |
2. 수식 연산자(+, -, *, /, %)
수식 연산자에는 덧셈, 뺄셈, 곱셈, 나눗셈, 그리고 나눗셈을 한 뒤의 나머지를 구하는 연산자들이 있습니다. 아래는 그 연산자들을 표로 정리한 것입니다.
분류 |
기능 |
예 |
+ |
양쪽 피연산자를 서로 더함 |
a + b |
- |
왼쪽 피연산자에서 오른쪽 피연산자를 뺌 |
a - b |
* |
양쪽 피연산자를 서로 곱함 |
a * b |
/ |
왼쪽 피연산자를 오른쪽 피연산자로 나눔 |
a / b |
% |
왼쪽 피연산자를 오른쪽 피연산자로 나눈 뒤의 나머지를 구함 |
a % b |
여기서, 피연산자란 연산의 대상을 말합니다. 예를 들어서, a + b라면 a와 b는 피연산자고 +는 연산자입니다.
아래는 수식 연산자를 사용하여 그 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 55, b = 4;
Console.WriteLine("{0} + {1} = {2}", a, b, a + b);
Console.WriteLine("{0} - {1} = {2}", a, b, a - b);
Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
Console.WriteLine("{0} / {1} = {2}", a, b, a / b);
Console.WriteLine("{0} % {1} = {2}", a, b, a % b);
}
}
}
...
Console.WriteLine("{0} / {1} = {2}", a, b, a / (double)b);
Console.WriteLine("{0} / {1} = {2}", a, b, (a + 0.0) / b);
Console.WriteLine("{0} / {1} = {2}", a, b, 1.0 * a / b);
...
일종의 꼼수이기는 하지만 위와 같은 방법으로 문제를 해결할 수 있습니다.
분류 |
기능 |
예 |
++ (전위 증가 연산자) |
피연산자의 값을 1만큼 증가 |
++a; |
-- (전위 감소 연산자) |
피연산자의 값을 1만큼 감소 |
--a; |
++ (후위 증가 연산자) |
피연산자의 값을 1만큼 증가 |
a++; |
-- (후위 감소 연산자) |
피연산자의 값을 1만큼 감소 |
a--; |
아래는 증감 연산자를 사용하여 그 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 1;
Console.WriteLine(++a); // a의 값을 1 증가시키고, a의 값을 출력 (a = 2)
Console.WriteLine(a++); // a의 값을 출력한 뒤, a의 값을 1 증가 (a = 3)
Console.WriteLine(--a); // a의 값을 1 감소시키고, a의 값을 출력 (a = 2)
Console.WriteLine(a--); // a의 값을 출력한 뒤, a의 값을 1 감소 (a = 1)
}
}
}
a++ + b
a++ + --b
++a + a++
분류 |
기능 |
예 |
< |
오른쪽 피연산자가 왼쪽 피연산자보다 크면 참, 작으면 거짓 |
a < b |
> |
왼쪽 피연산자가 오른쪽 피연산자보다 크면 참, 작으면 거짓 |
a > b |
== |
왼쪽 피연산자가 오른쪽 피연산자와 같으면 참, 다르면 거짓 |
a == b |
!= |
왼쪽 피연산자가 오른쪽 피연산자와 다르면 참, 같으면 거짓 |
a != b |
>= |
왼쪽 피연산자가 오른쪽 피연산자보다 크거나 같으면 참, 작으면 거짓 |
a >= b |
<= |
오른쪽 피연산자가 왼쪽 피연산자보다 크거나 같으면 참, 작으면 거짓 |
a <= b |
아래 예제는 관계 연산자를 사용하여 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 50, b = 60;
Console.WriteLine(a < b); // 50 < 60, True
Console.WriteLine(a > b); // 50 > 60, False
Console.WriteLine(a == b); // 50 == 60, False
Console.WriteLine(a != b); // 50 != 60, True
Console.WriteLine(a >= b); // 50 >= 60, False
Console.WriteLine(a <= b); // 50 <= 60, True
}
}
}
분류 |
기능 |
예 |
= |
오른쪽 피연산자를 왼쪽 피연산자에 할당 |
a = b; |
+= |
a += b는 a = a + b와 같음 |
a += b; |
-= |
a -= b는 a = a - b와 같음 |
a -= b; |
*= |
a *= b는 a = a * b와 같음 |
a *= b; |
/= |
a /= b는 a = a / b와 같음 |
a /= b; |
%= |
a %= b는 a = a % b와 같음 |
a %= b; |
아래는 할당 연산자를 사용하여 그 값을 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 50, b = 60;
a += b;
Console.WriteLine(a);
a -= b;
Console.WriteLine(a);
a *= b;
Console.WriteLine(a);
a /= b;
Console.WriteLine(a);
a %= b;
Console.WriteLine(a);
}
}
}
A |
B |
A && B |
참(T) |
참(T) |
참(T) |
참(T) |
거짓(F) |
거짓(F) |
거짓(F) |
참(T) |
거짓(F) |
거짓(F) | 거짓(F) | 거짓(F) |
<논리곱 연산자(&&)의 진리표>
논리곱(AND) 연산자의 특징은 A와 B 모두 참이여야 결과값으로 참을 반환합니다.
A |
B |
A || B |
참(T) |
참(T) |
참(T) |
참(T) |
거짓(F) |
참(T) |
거짓(F) |
참(T) |
참(T) |
거짓(F) |
거짓(F) |
거짓(F) |
<논리합 연산자(||)의 진리표>
논리합(OR) 연산자의 특징은 A나 B 둘중 하나라도 참일 경우에 결과값으로 참을 반환합니다.
A |
!A |
참(T) |
거짓(F) |
거짓(F) |
참(T) |
<부정 연산자(!)의 진리표>
부정(NOT) 연산자의 특징은 A가 참일 경우에 거짓을, 거짓일 경우에는 참을 결과값으로 반환합니다.
아래는 논리 연산자를 사용하여 그 결과를 출력한 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 50, b = 60;
Console.WriteLine(a > 40 && b > 50);
Console.WriteLine(a > 40 || b > 70);
Console.WriteLine(!(a < b));
}
}
}
분류 |
기능 |
예 |
& |
두 피연산자의 대응되는 비트에 논리곱(AND)을 수행 |
a & b |
| |
두 피연산자의 대응되는 비트에 논리합(OR)을 수행 |
a | b |
^ |
두 피연산자의 대응되는 비트에 배타적 논리합(XOR)을 수행 |
a ^ b |
여기서 & 연산자는 양쪽 비트가 모두 1이어야만 결과가 1이 되고, 그렇지 않으면 결과가 0이 됩니다. | 연산자는 양쪽 비트 중 하나라도 1이면 결과가 1이 됩니다. ^ 연산자는 양쪽 비트가 서로 달라야 결과가 1이 됩니다. 감이 잘 안오시나요? 예제를 바로 봐보도록 합시다.
아래는 비트 연산자를 사용하여 그 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 5, b = 10;
Console.WriteLine(a & b);
Console.WriteLine(a | b);
Console.WriteLine(a ^ b);
}
}
}
결과:
0
15
15
계속하려면 아무 키나 누르십시오 . . .
위의 결과가 어떻게 해서 이렇게 나왔는지 아래에서 확인하실 수 있습니다. 10진수 5를 2진수로 나타내면 101(2), 10진수 10을 2진수로 나타내면 1010(2)와 같습니다.
7. 시프트 연산자 (>>, <<)
시프트 연산자도 비트 연산과 관련된 연산자입니다. 이 연산자를 통해 첫 번째 피연산자를 두 번째 피연산자로 지정된 비트 수만큼 왼쪽(<<)으로 이동시키거나 오른쪽(>>)으로 이동시킬 수 있습니다.
아래는 시프트 연산자를 사용하여 그 결과를 출력하는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 616;
Console.WriteLine(a << 4);
Console.WriteLine(a >> 4);
}
}
}
결과:
9856
38
계속하려면 아무 키나 누르십시오 . . .
우선, 616을 2진수로 나타내면 1001101000(2) 입니다. 이 비트열을 왼쪽으로 4만큼 이동시키면 아래와 같이 10011010000000(2)가 될 것입니다. 이는 10진수로 나타내면 9856 입니다. 비트열을 왼쪽으로 이동시키면서 새로 나타난 하위 비트는 0으로 채워집니다.
다시 기존 비트열을 오른쪽으로 4만큼 이동시키면 아래와 같이 100110(2)이 될 것입니다. 이는 10진수로 나타내면 38 입니다. 비트열을 오른쪽으로 이동시키면서 새로 나타난 상위 비트는 부호 비트로 채워집니다. (부호 비트는 양수의 경우는 0, 음수의 경우는 1)
다음은 분기문(if, else, switch)에 대해 알아보도록 하겠습니다. 수고하셨습니다.
'프로그래밍 관련 > C#' 카테고리의 다른 글
C# 강좌 6편. 반복문(while, do, for, foreach) [최근 수정 2017.11.10] (13) | 2018.01.12 |
---|---|
C# 강좌 5편. 조건문(if, else, switch) [최근 수정 2017.11.10] (18) | 2018.01.12 |
C# 강좌 4편. 연산자(Operators) [최근 수정 2017.10.29] (30) | 2018.01.12 |
C# 강좌 3편. 변수, 데이터 형식, 상수 [최근 수정 2017.10.29] (50) | 2018.01.12 |
C# 강좌 2편. Hello, world! [최근 수정 2017.11.27] (37) | 2018.01.12 |
C# 강좌 1편. 시작 (26) | 2018.01.12 |
감사합니다~
질문이 있습니다.
public int32? category {get; set;}
이건 무슨뜻인가요?;; int32 뒤에 물음표가 붙는건 무엇을 의미하는지 모르겠어요;;
강의잘들었습니다 계속 쓰시는건가요? 계속 듣고 싶네욤
감사합니다. ^^
좋은 공부됫습니다.
뒤늦게 취직해서 c#공부하고 있습니다^^
강좌 정말 정말 좋네요^^
좋은강좌 올려주셔서 감사합니다. 쭉 보는 중입니다.
좋은 자료 감사합니다. 초본데 정말 많은 도움받아갑니다.
앞으로도 잘 부탁드립니다.
항상 감사합니다. 좋은 강좌 많이 많이 올려주세요~
여쭤보고 싶은 게 있습니다.
증감연산자에서 // 옆에 다신 커멘트의 a 값이랑 다르게 실행 후 콘솔에 뜨는 결과값은
2
2
2
2
인데, 왜 이런 차이가 발생하는지 혹시 조금만 더 자세히 설명해주실 수 있나요?
감사합니다.
ㅎㅎ 잘보고 갑니다! 감사합니다.
잘 보았습니다.
잘 보고 있습니다.
평이하면서도 놓치지 않는 강의 감사합니다..
좋은 강좌감사합니다.
근데 보다가 맨밑에있는 비트연산자가 이해가 잘안가는데
int a = 5, b = 10;
Console.WriteLine(a & b); // 상위 3바이트 생략, 00000101 & 00001010 = 00000000(0)
Console.WriteLine(a | b); // 상위 3바이트 생략, 00000101 | 00001010 = 00001111(15)
Console.WriteLine(a ^ b); // 상위 3바이트 생략, 00000101 ^ 00001010 = 00001111(15)
왜이게 0,15,15가 나오는거죠? 정확히 이해가안되네요.
비트연산자는 둘중 하나여야지만 참이라고 하시는데 밑에꺼랑 위에꺼랑 뭔 연관이있는건가요?..
저... 612는 1001101000 이 아니라 1001100100 입니다만...
감사합니다
강좌 잘 보고 있습니다!
질문 하나 해도 괜찮을지요?
할당 연산자 예시에서
int a = 50, b = 60;
a -= b;
Console.WriteLine(a);
a /= b;
Console.WriteLine(a);
이면 a -= b 의 결과는 50-60이니까 -10
a /= b 의 결과는 50/60이니까 0이 나와야 하는것 아닌가요?
a,b값의 값을 10과 3으로 바꿔도 마찬가지로 10, 10이 나오는데 왜그런건가요?
아.. 제가 질문을 조금 이상하게 했네요
본문에 있는 할당 연산자 파트에 있는 아래의 예시에서 -= 과 /= 의 결과가 잘 이해되지 않습니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = 50, b = 60;
a += b;
Console.WriteLine(a);
a -= b;
Console.WriteLine(a);
a *= b;
Console.WriteLine(a);
a /= b;
Console.WriteLine(a);
a %= b;
Console.WriteLine(a);
}
}
}
여기에서
a -= b 라면 a = 50-60 이므로 결과값이 -10이어야 하는데 50이 나오고,
a /= b 라면 a = 50/60 이므로 결과값 0이 나와야 하는데 역시 50으로 나오는건 왜 인가요?
아! 그 윗줄의 계산 결과가 이어지는것이었군요!
이해했습니다 감사합니다!
안녕하세요...
강의 잘보고 있습니다.
한가지 궁굼해서요
비트연산자를 사용하는 이유가 무엇인지 실무에서는 어떤경우 이용하는지
혹시 사례정도를 들어주시면 감사하겠습니다. ^^