본문 바로가기
개발/Unity 내일배움캠프 TIL

[내일배움단] 사전캠프 C# TIL 3. 연산자

by 석시 2023. 7. 19.



산술 연산

사칙연산

int x = 10;
int result;

// 더하기
result = x + 3; // result : 13
Console.WriteLine(result);

// 빼기
result = x - 5; // result : 5
Console.WriteLine(result);

// 곱하기
result = x * 2; // result : 20
Console.WriteLine(result);

// 나누기의 몫
result = x / 3; // result : 3
Console.WriteLine(result);

// 나누기의 나머지
result = x % 3; // result : 1
Console.WriteLine(result);

출력

하나 짚고 넘어갈 것은 / 연산보다는 * 연산이 빠르기 때문에 가능하면 *를 이용하라는 점이다.

추가적으로 정수를 2의 거듭제곱으로 나누거나 곱하는 상황은 비트 연산자를 이용하는 것이 가장 빠르다.

int x = 10;
int result;

// 세 결과는 모두 5로 동일하다.
result = x / 2;
Console.WriteLine(result);
result = (int)(x * 0.5f);
Console.WriteLine(result);
result = x >> 1;
Console.WriteLine(result);

증감 연산 (++, --)

우리의 단골 손님이다.

반복문을 사용할 때 매우 자주 사용하게 될텐데…

특징은 크게 두 가지가 있다.

  1. 1씩 연산
  1. 변수에 바로 계산

int x = 10;
x++; 
// x : 11

int y = 10;
y--;
// y : 9

아주 간단하게 더하기 1과 빼기 1을 계산할 수 있게 된다.

여기서 간단함을 느낄 수 있다는 것은, 나중에 연산자 오버로딩이 필요한 상황이 한 번 더 있으리라는 것과 같지 않나.

(적어도 C++에선 그랬는데)

가장 헷갈릴만한 부분은 다음의 전위 연산과 후위 연산이다.

int x = 10;
x++;  // 해당 라인을 다 수행하고 더하기 1
++x;  // 해당 라인을 수행하기 전에 더하기 1

해당 라인을 수행하기 전에 더하기 1을 하느냐, 아니면 해당 라인을 다 수행한 뒤에 더하기 1을 하느냐가 그 차이이다.

int x = 10;
Console.WriteLine(x++); // 10 출력 - ++ 를 x 뒤에 붙였기 때문에 여기까지는 아직 10입니다.
Console.WriteLine(x); // 11 출력 - 이후에는 11로 저장된 것을 볼 수 있습니다.

int y = 10;
Console.WriteLine(++y); // 11 출력 - ++ 를 x 앞에 붙였기 때문에 여기서 부터 11 로 인식합니다.
Console.WriteLine(y); // 11 출력 - 물론 이후에도 저장된 11로 남아있습니다.

정신만 차리면 헷갈릴 일은 없다.

참고로 더하기 1만 수행하기 위해 해당 연산자를 사용하는 경우라면 전위 연산을 사용하는 것이 더 좋다.

조금이라도 더 빠르기 때문이다.

후위 연산의 경우 라인을 먼저 수행하기 위해 1을 더하려는 값을 먼저 다른 곳에 저장하게 된다.

전위 연산은 그럴 필요가 없기 때문에 살짝 더 빠른 것이다.

문자열 연산

string hel = "안녕";
string lo = "하세요!";

string result = hel + lo;
result = result + " 스파르타 코딩클럽 입니다!";
Console.WriteLine(result);

int year = 2023;

result  = year + "년 입니다.";
Console.WriteLine(result);

편하게도 문자열에 더하기가 된다.

문제 풀 때 편할듯.

논리 연산

정리표

>a > ba가 b보다 크면 true
>=a >= ba가 b보다 크거나 같으면 true
<a < bb가 a보다 크면 true
<=a <= bb가 a보다 크거나 같으면 true
== ⭐⭐a == ba와 b가 같으면 true
!=a != ba와 b가 다르면 true
&&a && b두 가지 조건이 모두 만족하면 true
||a || b둘 중 하나만 만족하면 true

논리 연산자들이다.

output으로 bool 타입의 값을 뱉어낸다고 생각하면 된다.

bool 자료형

bool isLarge = 10 > 5;

true 또는 false 값만 가지게 되는 자료형이다.

조건문과 반복문에 아주 자주 쓰인다.

특이한 점은 참, 거짓만 저장하기 때문에 크기가 1bit라고 생각하기 쉽지만 4bit, 즉, 1byte의 크기를 가지고 있다.

나중에 메모리를 다룰 일이 있다면 나오겠지만 메모리에서 byte 단위로 데이터를 처리하기 때문에 boolean 자료에도 1 byte씩 처리를 하기 때문이다.

비트 연산

정리표

&a & ba와 b비트가 일치하는 것을 계산And 연산자
|a | ba와 b비트 중 하나만 일치해도 계산Or 연산자
^a ^ ba와 b비트가 다른것만 계산Xor 연산자
<<a << ba의 비트를 왼쪽으로 b만큼 이동시프트 연산자
>>a >> ba의 비트를 오른쪽으로 b만큼 이동시프트 연산자

비트 연산자들, 말 그대로 비트 단위의 연산을 수행한다.

어느 데이터든지 각 비트 간 관계성을 전혀 고려하지 않고 말 그대로 비트 하나하나에 대한 연산을 하는 것이다.

논리 연산자와 헷갈릴 수 있는데, 가장 쉽게 구분하는 방법은 output으로 무엇을 뱉느냐이다.

논리 연산자는 출력으로 true or false를, 비트 연산자는 출력으로 계산된 비트 시퀀스를, 이렇게만 알아도 헷갈릴 일이 잘 없다.

쓸 데가 없어보이지만, 생각보다 굉장히 자주나오고, 연산 속도가 엄청 빠르다.

가장 기초적으로 생각할 수 있는 것은, 곱하기 2와 나누기 2를 시프트 연산자를 이용해 아주 빠르게 수행할 수 있고, 다른 2의 거듭제곱에 대한 곱하기와 나누기도 마찬가지이다.

참고) 연산자의 순서

일반적인 수학 계산에서도 곱하기를 더하기보다 먼저하는 것처럼, 컴퓨터의 연산에도 순서가 있다.

자세한 건 아래의 페이지를 참고하자.

C# 연산자 및 식 - C# 참조
C# 연산자 및 식, 연산자 우선 순위, 연산자 결합성에 대해 알아보세요.
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/

연습문제

  1. 숫자의 사칙연산

ten 이라는 변수를 각각의 사칙 연산을 적용하여 각각 변수에 저장한 후 출력

int ten = 10;


//  7 더하기
//  3 빼기
//  2 곱하기
//  1.5 곱하기
//  3 으로 나누기
//  4 로 나눴을때 나머지
  • 정답
    // 2-1. 숫자의 사칙연산
    {
        int ten = 10;
    
    
        int ans1 = ten + 7;  //  7 더하기
        Console.WriteLine(ans1);
    
        int ans2 = ten - 3;  //  3 빼기
        Console.WriteLine(ans2);
    
        int ans3 = ten * 2;  //  2 곱하기
        Console.WriteLine(ans3);
    
        float ans4 = (float)ten * 1.5f;//  1.5 곱하기
        Console.WriteLine(ans4);
    
        float ans5 = (float)ten / 3;  //  3 으로 나누기
        Console.WriteLine(ans5);
    
        int ans6 = ten % 4;  //  4 로 나눴을때 나머지
        Console.WriteLine(ans6);
    }

  1. 문자의 계산
string name = "chad"; // 자신의 이름, 닉네임 으로 연습해보세요.
int year = 2023;

// 위 변수를 이용해서 아래 문자열을 만들어 보세요.

string introduce; // 안녕하세요. 제 이름은 "chad" 입니다.
string thisYear; // 올해는 '2023년' 입니다.
  • 정답
    // 2-2. 문자의 계산
    {
        string name = "chad"; // 자신의 이름, 닉네임 으로 연습해보세요.
        int year = 2023;
    
        string introduce = "안녕하세요. 제 이름은 \"";
        string thisYear = "올해는 \'";
    
        string ans1 = introduce + name + "\" 입니다.";
        Console.WriteLine(ans1);
    
        string ans2 = thisYear + year + "년\' 입니다.";
        Console.WriteLine(ans2);
    }

  1. 논리 연산
int ten = 10;

// 아래의 결과값이 전부 true 가 되도록 논리연산을 만들어 보세요.

bool result_1;    // ten 이 10 이랑 같다
bool result_2;    // ten 이 11 이랑 같지 않다
bool result_3;    // ten 이 20 보다 작다
bool result_4;    // ten 이 5 보다 크다
  • 정답
    // 2-3. 논리 연산
    {
        int ten = 10;
    
        bool result_1 = (ten == 10);    // ten 이 10 이랑 같다
        Console.WriteLine(result_1);
        bool result_2 = (ten != 11);    // ten 이 10 이랑 같지 않다
        Console.WriteLine(result_2);
        bool result_3 = (ten < 20);    // ten 이 20 보다 작다
        Console.WriteLine(result_3);
        bool result_4 = (ten > 5);    // ten 이 5 보다 크다
        Console.WriteLine(result_4);
    }

Uploaded by N2T