본문 바로가기
전공/C# 프로그래밍

4강. 데이터 가공을 위한 연산자

by 임 낭 만 2023. 4. 16.

데이터 가공을 위한 연산자

C#의 연산자 개요

  • 각 연산자 특정 형식에 대해서만 사용 가능
    • 나눗셈 연산자 ”/”는 모든 수치데이터 형식 사용 가능
    • 하지만, 나눗셈 연산자는 문자열 형식은 사용 불가

연산자 (Operator) : 컴파일러에게 데이터 가공을 지시하는 기

산술 연산자

  • 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나눗셈의 나머지(%)
  • 정수형식, 부동 소수점 형식, decimal 형식만 사용 가능

수치 형식의 데이터를 다루는 연산자. 두 개의 피연산자가 필요한 이항 연산자(Binary Operator)임 !! 

using System;

namespace ArithmaticOperators
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 111 + 222;
            Console.WriteLine($"a : {a}");

            int b = a - 100;
            Console.WriteLine($"b : {b}");

            int c = b * 10;
            Console.WriteLine($"c : {c}");

            double d = c / 6.3;
            Console.WriteLine($"d : {d}");

            Console.WriteLine($"22 / 7 = {22 / 7}({22 % 7})");
        }
    }
}

증가 / 감소 연산자

  • 증가/감소 연산자는 변수 앞 또는 뒤에 ++/-- 추가
    • 전위 증가/감소 연산자: ++/--가 변수 앞에 위치
    • 후위 증가/감소 연산자: ++/--가 변수 뒤에 위치

using System;

namespace IncDecOperator
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            Console.WriteLine(a++); // 후위 증가 연산자: 10 출력 후, a는 11로 증가
            Console.WriteLine(++a); // 전위 증가 연산자: a가 12로 증가 후, 12 출력

            Console.WriteLine(a--); // 후위 감소 연산자: 12 출력 후, a는 11로 감소
            Console.WriteLine(--a); // 전위 감소 연산자: a가 10로 감소 후, 10 출력
        }
    }
}

문자열 결합 연산자

  • 문자열과 문자열 사이에 “+”를 사용
    • 문자열 형식에 사용
    • 해당 두 문자열을 하나의 문자열로 연결

수치 형식에 사용하는 + 연산자는 덧셈 연산자. String 형식에 사용하는 + 연산자는 덧셈 연산자가 아닌, 문자열 결합 연산자.

using System;

namespace StringConcatenate
{
    class Program
    {
        static void Main(string[] args)
        {
            string result = "123" + "456";
            Console.WriteLine(result);

            result = "Hello" + " " + "World!";
            Console.WriteLine(result);
        }
    }
}

관계 연산자(Relational Operator)

  • 두 피연산자 사이의 관계를 평가
    • 같은지 또는 다른지, 한쪽이 다른 한쪽보다 값이 큰지 혹은 작은지 평가
    • <, >, <=, >= 연산자 : 모든 수치 형식과 열거 형식에 사용 가능
    • ==, != 연산자 : 모든 데이터 형식에서 사용가능
using System;

namespace RelationalOperator
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"3>4 : {3>4}");
            Console.WriteLine($"3>=4 : {3 >= 4}");
            Console.WriteLine($"3<4 : {3 < 4}");
            Console.WriteLine($"3<=4 : {3 <= 4}");
            Console.WriteLine($"3==4 : {3 == 4}");
            Console.WriteLine($"3!=4 : {3 != 4}");
        }
    }
}

 

논리 연산자(Logical Operation)

  • 참과 거짓으로 이루어지는 진리값이 피연산자인 연산

부울 연산 (Boolean Operation)이라고도 함. (분기문과 반복문에 자주 사용됨)

조건 연산자(Conditional Operator)

  • 세개의 피연산자를 사용
    • 첫 매개변수 “조건식”의 결과는 참 또는 거짓
    • 조건식이 참이면 두번째 매개변수 선택, 거짓이면 세번째 매개변수 선택
    • 두번째와 세번째 매개변수는 같은 데이터형식

조건에 따라 두 값 중 하나의 값을 반환 ( 결과가 논리 값임 )

null 조건부 연산자

  • 객체의 멤버에 접근하기 전, 해당 객체가 null인지 검사
    • 객체가 null 이면, 그 결과로 null 반환
    • 객체가 null 이 아닌 경우, 뒤에 지정된 멤버를 반환
    • C# 6.0부터 지원

객체 ?.반환멤버
객체 ?[배열 (컬렉션)의 인덱스]

null 병합 연산자 "??"

  • 두 피연산자에 대해 왼쪽 피연산자가 null인지 평가
    • 평가결과가 null 이 아니면, 그 결과로 왼쪽 피연산자 그대로 반환
    • 평가결과가 null 이면, 오른쪽 피연산자 반환

필요한 변수 / 객체의 null 검사를 간결하게 만들어주는 역할

형식 : OP1 ?? OP2 (OP1이 NULL인지 여부에 따라...)

using System;

namespace NullCoalescing
{
    class Program
    {
        static void Main(string[] args)
        {
            int? num = null;
            Console.WriteLine($"{num ?? 0}");

            num = 99;
            Console.WriteLine($"{num ?? 0}");

            string str = null;
            Console.WriteLine($"{str ?? "Default"}");

            str = "Specific";
            Console.WriteLine($"{str ?? "Default"}");
        }
    }
}

비트 연산자 종류

비트 연산자 : 비트 수준에서 데이터를 가공하는 연산자. 데이터 형식의 크기는 주로 바이트 단위를 사용하는데 더 작은 단위로 데이터를 가공해야 할 경우 사용. (1바이트 = 8비트)

비트 연산자 : 시프트 연산자

  • 비트를 왼쪽(<<) 또는 오른쪽 (>>)으로 이동시키는 연산자
  • 예를 들어, 10진수 240을 16비트로 표현 후 왼쪽/오른쪽 시프트
    • 시프트 연산자 지원형식은 32비트 이상이지만, 설명을 위해 16비트 사용

좌) 1. 240을 비트로 나타낸 모습 2. 전체 비트를 왼쪽으로 2비트 밀어내고, 밀려나간 왼쪽의 두 개의 비트는 제거 3. 오른쪽에 비어있는 두 비트 공간은 0으로 채움 // 우) 반대

음수에 대한 시프트 연산자

  • 비트 이동 후 빈자리에 0이 아닌 1로 채움
  • 예를 들어, -255를 비트로 표현하면 1111 1111 0000 0001

시프트 연산자 활용

  • 고속의 곱셈과 나눗셈을 구현
    • 원본 데이터를 a, 옮긴 비트 수를 b라고 할 때,
    • $a\ll b=a\times 2^{b}$이고, $a\gg b=a\div 2^{b}$
    • 예를 들어, 240의 왼쪽 2비트 시프트 결과는 960 이고, 오른쪽 2비트 시프트 결과는 60
  • 작은 단위로 쪼개진 데이터를 큰 데이터 형식으로 재조립
    • byte 형식의 데이터들을 하나의 int 또는 long 형식으로 표현
    • 논리곱(&), 논리합(|) 연산자와 함께 사용
using System;

namespace ShiftOperator
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 1;      // Testing <<...
            Console.WriteLine("a     : {0:D5} (0x{0:X8})", a);
            Console.WriteLine("a << 1: {0:D5} (0x{0:X8})", a << 1);
            Console.WriteLine("a << 2: {0:D5} (0x{0:X8})", a << 2);
            Console.WriteLine("a << 5: {0:D5} (0x{0:X8})", a << 5);
            
            int b = 255;    // Testing >>...
            Console.WriteLine("b     : {0:D5} (0x{0:X8})", b);
            Console.WriteLine("b >> 1: {0:D5} (0x{0:X8})", b >> 1);
            Console.WriteLine("b >> 2: {0:D5} (0x{0:X8})", b >> 2);
            Console.WriteLine("b >> 5: {0:D5} (0x{0:X8})", b >> 5);
            
            int c = -255;   // Testing negative number >>...
            Console.WriteLine("c     : {0:D5} (0x{0:X8})", c);
            Console.WriteLine("c >> 1: {0:D5} (0x{0:X8})", c >> 1);
            Console.WriteLine("c >> 2: {0:D5} (0x{0:X8})", c >> 2);
            Console.WriteLine("c << 5: {0:D5} (0x{0:X8})", c << 5);
        }
    }
}

비트 논리 연산자 : 논리곱, 논리합

비트 논리 연산자 : 각 비트에 대해 수행하는 논리 연산. Bool 형식과 정수 계열 형식임. 각 비트에 대해 1은 True, 0은 False

논리곱 연산자 (&), 논리합 연사자(|), 배타 논리합 연산자 (^), 보수 연산자 (~)

  • bool 형식 외에 정수 계열 형식의 피연산자에 대해도 사용
  • 논리곱(&) 연산자
    • 두 비트 모두 1(참)이어야 결과도 1(참)

  • 논리합(|) 연산자
    • 두 비트 중 하나라도 1(참)이면 결과도 1(참)

비트 논리 연산자 : 배타적 논리합

  • 배타적 논리합(^) 연산자
    • 두 비트 진리 값이 서로 달라야 1(참)

  • 보수(~) 연산자
    • 단항 연산자로 비트를 0에서 1로, 1에서 0으로 반전

using System;

namespace BitwiseOperator
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 9, b = 10;
            Console.WriteLine($"a << 1 : {a << 1}");
            Console.WriteLine($"b >> 2 : {b >> 2}");
            Console.WriteLine($"a & b : {a & b}");
            Console.WriteLine($"a | b : {a | b}");
            Console.WriteLine($"a ^ b: {a ^ b}");
            Console.WriteLine($"~a : {~a}");
        }
    }
}

할당 연산자

  • 복합 할당 연산자 (+=, -=, *= 등등)
    • 왼쪽 피연산자와 오른쪽 피연산자를 ‘=‘의 왼쪽 연산자로 가공 후,
    • 다시 왼쪽 피연산자에 할당

using System;

namespace AssignmentOperator
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 100;
            Console.WriteLine($"a += 90 : {a += 90}");
            Console.WriteLine($"a -= 80 : {a -= 80}");
            Console.WriteLine($"a *= 70 : {a *= 70}");
            Console.WriteLine($"a /= 60 : {a /= 60}");
            Console.WriteLine($"a %= 50 : {a %= 50}");
            Console.WriteLine($"a &= 40 : {a &= 40}");
            Console.WriteLine($"a |= 30 : {a |= 30}");
            Console.WriteLine($"a ^= 20 : {a ^= 20}");
            Console.WriteLine($"a <<= 10 : {a <<= 10}");
            Console.WriteLine($"a >>= 10 : {a >>= 1}");
        }
    }
}

연산자의 우선순위

'전공 > C# 프로그래밍' 카테고리의 다른 글

6강. 메소드 (Method)  (0) 2023.04.17
5강. 코드 흐름 제어  (0) 2023.04.16
3강. 문자열 다루기  (0) 2023.04.16
2강. 데이터 타입 (2)  (0) 2023.04.15
2강. 데이터 타입 (1)  (2) 2023.04.14

댓글