[ 연산자 ]
산술 연산자
+, -, *, /, %
간단히 말해 사칙연산을 하는 연산자이다. /, %는 자료형에 따라 쓰임새가 다른데, int에서 /는 소수점 없이 몫이 나오고 %는 나머지 값이 나온다.
정수형끼리 연산을 할 때 결과값을 소수점을 포함한 실수형으로 나오게 하고 싶다면, 둘 중 하나는 실수형으로 바꿔주어야 한다.
할당 연산자
+=, -=, *=, /=, %=
변수에 값을 할당함과 동시에 연산을 하는 연산자이다.
단항 연산자
x++: 변수값 사용 후 1을 더해줌
x- -: 변수값 사용 후 1을 빼줌
++x: 변수값 사용 전 1을 더해줌
- -x: 변수값 사용 전 1을 빼줌
비교 연산자
==, !=, >, <, >=, <=
두 값이 동일한지 비교하거나, 크기를 비교한다.
논리 연산자
- &&: 그리고(AND)
x × y
*참은 1, 거짓은 0
위의 수식에서 둘 중 하나라도 0이면 0이기 때문에 둘 다 참이어야 참이다.
참&&거짓 → 거짓
- ||: 또는(OR)
x + y
위의 수식에서 둘 중 하나라도 참이면 1 이상이 되기 때문에 참이다.
- !: 부정(NOT)
부정, not을 의미한다. b = !b는 반대값을 대입하는 것으로 값을 뒤집어준다.
0 → 1, 1 → 0
※ b != b는 서로 다른지 비교하는 것이다.
if문의 조건이 !b라면 !b는 true여야 하므로 b는 false여야 if문 실행된다. !b는 b==false와 같다.
- ^: 배타적(XOR)
둘 중 하나만 참일 때 참이다. 둘 다 참이거나 거짓이면 거짓이다.
[ 비트 연산자 ]
- &: 그리고(AND)
비트 단위로 두 비트를 곱하는 것이다. 따라서 두 비트 모두 1이어야 1이 된다.
- |: 또는(OR)
비트 단위로 두 비트를 더하는 것이다. 따라서 둘 중 하나만 1이어도 1이 된다.
- ~: 부정(NOT)
반대 값으로 반전시킨다. 1은 0으로, 0은 1로 바뀐다.
- ^: 배타적(XOR)
두 비트가 다를 때 1이 된다. 두 비트가 같다면 0이 된다.
시프트 연산
- <<: 왼쪽 시프트(Left Shift)
지정된 비트 수만큼 왼쪽으로 이동시키고, 오른쪽은 0으로 채운다.
숫자가 2개이기 때문에 2를 곱하면 왼쪽으로 한 칸씩 이동한다.
위 사진을 예시로 들어보자. 5 << 1에서 1은 2의 개수이다. 왼쪽 방향은 곱셈이므로 5×2=10이 나온다.
- >>: 오른쪽 시프트(Right Shift)
지정된 비트 수만큼 오른쪽으로 이동시키고, 왼쪽은 0으로 채운다.
숫자가 2개이기 때문에 2를 나누면 오른쪽으로 한 칸씩 이동한다.
5 >> 1에서 오른쪽 방향은 나누기이므로 5×÷2=2가 나온다. 여기서 나온 값인 2는 몫이 된다.
단축 평가
int a = 10;
int b = 5;
//&& 연산자
if (a < 5 && ++b < 10)
{
Console.WriteLine("참입니다.");
}
Console.WriteLine(b); //5
//|| 연산자
if (a > 5 || ++b < 10)
{
Console.WriteLine("참입니다.");
}
Console.WriteLine(b); //5
&&는 앞에 것이 거짓이면 뒤에는 계산이 안 되고, ||는 앞에 것이 참이면 뒤에는 계산이 안 된다. 따라서 ++b 계산이 실행되지 않아 출력했을 때 값이 6이 아니라 5가 나온다.
하지만 비트 연산자는 뒤에 것까지 다 연산하기 때문에, 단축 평가가 일어났을 때 뒤의 조건식을 실행시키기 위해 따로 코드를 더 작성할 필요가 없다.
비트 플래그
비트 플래그는 각 비트를 ON(1), OFF(0)로 표시해서 데이터의 특정 상태나 옵션을 효율적으로 나타내는 기법이다. 각 비트 위치가 특정 상태나 설정을 나타내며, 이러한 비트들을 조합하여 다양한 설정과 상태를 한 번에 처리할 수 있다.
버프 창을 예시로 들어보자.
숫자 9라는 정보를 받았다. 9를 이진수로 표현하면 1001이다. 그러면 첫 번째 비트와 네 번째 비트가 활성화된 것이다. 따라서 캐릭터는 현재 크리티컬 확률 2배와 경험치 200% 버프를 받고 있는 것이다.
숫자 100이라는 정보를 받을 때는 이진수로 표현하면 1100100이다. 따라서 세 번째, 여섯 번째, 일곱 번째 비트가 활성화됐다. 현재 캐릭터는 재화 300%, 자동 회복, 이동속도 증가 버프를 받고 있다.
비트 연산자 장점
비트 연산자를 사용하면 작은 메모리 공간에 많은 정보를 담을 수 있어서 메모리를 아낄 수 있고, 처리 속도가 빠르다. 또한 불리언과 조건문을 이용한 복잡한 로직을 단순화할 수 있어 관리가 편하고, 정보를 판단하는 데 효율적이다. 또한 단순 숫자로 정보가 오가기 때문에 정보 추상화가 이루어져서 보안이 강화된다.
[ 2진법 ]
우리가 평소에 사용하는 수 체계는 10진법이다. 한 자릿수 위로 올라갈 때 10배가 되므로 10진법이라고 부른다. 예를 들어 1에서 한 자릿수가 올라가면 10이고, 한 자릿수 위로 올라가기까지 수가 10개이므로 1×10이 됐다.
2진수는 숫자가 0과 1로 2개 밖에 없다. 그래서 수를 2번 세면 자릿수가 올라간다. 즉 한 자릿수마다 2의 n승이 된다.
8자리 1바이트가 되고, 0b101, 0b1010처럼 맨 앞의 0b는 2진수라는 표시이다.
2진수는 수를 2로 나눴을 때 나온 나머지를 역순으로 조합한 수이다.
10을 예시로 들어보자.
10 ÷ 2 = 5, 나머지 0
5 ÷ 2 = 2, 나머지 1
2 ÷ 2 = 1, 나머지 0
맨 마지막의 몫과 다른 나머지를 역순으로 조합해서 1010이 나온다.
[ 회고 ]
2진법은 예전에 한 번 들어보고 이해하기를 포기했었는데, 이번에 튜터님의 강의와 다른 수강생 분들의 말을 통해 구조를 이해하게 됐다. 그리고 게임에서 2진수가 버프 같은 on, off 기능에서 사용할 수 있다는 것을 알고 확실하게 개념을 잡고 가는 것이 중요하다고 생각됐다. 아직은 비트 개념이 헷갈리지만, 계속해서 접하고 사용하다보면 익숙해지지 않을까하는 생각이 든다.
'Coding > C#' 카테고리의 다른 글
[내일배움캠프 10일차 TIL] 멤버, 클래스 상속, 유니티 라이프 사이클 (0) | 2024.04.26 |
---|---|
[내일배움캠프 9일차 TIL] Txt 게임 만들기 (1) | 2024.04.25 |
[내일배움캠프 7일차 TIL] 배열, 컬렉션, 메서드, 구조체, 조건문, 반복문 (0) | 2024.04.23 |
[내일배움캠프 6일차 TIL] C#, 객체 지향, 변수, 자료형, 형변환 (0) | 2024.04.22 |
C# 배열 생성 및 데이터 저장, 접근, 배열 리터럴, 인덱스 (0) | 2024.04.13 |