데이터 가공을 위한 연산자
C#의 연산자 개요
- 각 연산자 특정 형식에 대해서만 사용 가능
- 나눗셈 연산자 ”/”는 모든 수치데이터 형식 사용 가능
- 하지만, 나눗셈 연산자는 문자열 형식은 사용 불가
산술 연산자
- 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나눗셈의 나머지(%)
- 정수형식, 부동 소수점 형식, 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)
- 참과 거짓으로 이루어지는 진리값이 피연산자인 연산
조건 연산자(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"}");
}
}
}
비트 연산자 종류
비트 연산자 : 시프트 연산자
- 비트를 왼쪽(<<) 또는 오른쪽 (>>)으로 이동시키는 연산자
- 예를 들어, 10진수 240을 16비트로 표현 후 왼쪽/오른쪽 시프트
- 시프트 연산자 지원형식은 32비트 이상이지만, 설명을 위해 16비트 사용
음수에 대한 시프트 연산자
- 비트 이동 후 빈자리에 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 |
댓글