연산자의 정의
연산자는 메모리 혹은 레지스터 내의 데이터들을 가공하기 위해 C/C++ 에서 제공하는 기본적인 키워드들입니다.
우리가 연산자라고 했을때 떠올리기 쉬운 단순한 사칙연산 기호(+ , - 등)부터
sizeof, new, delete 같은 키워드들도 연산자의 범주에 속합니다.
쉬운 이해를 위해서, 연산자는 함수의 일종으로 생각할 수 있으며, 객체지향언어에서는 함수로 취급되는 경우가 많습니다.
예를 들어 +연산자를 쓴다면 A + B같은 식으로 표현하고, 함수로 풀어보면, 아래와 같습니다.
int operator +(int A,int B)
{
return A+B;
}
연산자의 우선순위
위는 연산자를 일반적으로 분류하는 방법인 기능 및 우선순위에 따라 나눈 표입니다. 모든 연산자에는 우선순위가 존재합니다.
- 우선할 연산자를 지정해 두어 문법의 애매모호함을 제거합니다.
- 각 C 컴파일러별로 같은 코드를 서로 다르게 컴파일 해버리는 경우가 없도록 규정화 합니다.
2 \* 1 + 1
- * 의 우선순위가 높다면 컴파일러는 (2*1) + 1로 이를 인지하고, 실행시 결과는 3이 됩니다.
- +의 우선순위가 높다면 2 * (1 + 1)로 인지하고, 결과는 4가 됩니다.
연산자의 종류
연산자는 단항 연산, 이항 연산, 삼항 연산으로 나뉩니다.
이름에서 나타나듯이 단항은 항이 하나, 이항은 항이 둘, 삼항은 항이 셋이 필요한 연산입니다.
연산자의 종류 (단항) - 부호 연산자
일반적으로 의미하는 음수와 양수의 부호를 의미합니다.
+100 이나 -100같이 상수 앞에 붙은 부호가 해당합니다.
연산자의 종류 (단항) - 증감 연산자
++ 나 --가 해당하며, 1을 더하거나 빼는 연산자입니다.
- A++, ++A
- A--, --A
실질적 계산은 A = A + 1 이나 A = A - 1과 같습니다.
이 연산자는 변수의 앞이나 뒤에 붙을 수 있으며, 우선순위를 뜻합니다.
int val = 10;
int result;
result = ++val;
위와 같이 변수의 앞에 붙는 형태를 전위 증감연산자라고 하며, = 대입연산자보다 우선순위가 높습니다.
따라서 위의 식은 ++val 을 먼저 처리한 후 그 결과를 result 에 대입합니다.
result 는 11이 대입되며, val 역시 11이 됩니다.
int val = 10;
int result;
result = val++;
위와 같이 변수의 뒤에 붙는 형태를 후위 증감연산자라고 하며, = 대입연산자보다 우선순위가 낮습니다.
따라서 위의 식은 result = var 을 먼저 처리한 후 val 을 증가시킵니다.
result 는 10이 대입되며, val 도 11이 됩니다.
연산자의 종류 (이항) - 산술 연산자
일반적으로 이야기 하는 사칙연산입니다. + - * / %가 이에 해당합니다.
int val = 10;
val = 1 + 2;
val = 1 - 2;
val = 2 / 2;
val = 3 % 2;
- A + B (더하기)
- A - B (빼기)
- A * B (곱하기),
- A / B (나누기),
- A % B (A를 B로 나눈 나머지)
연산자의 종류 (이항) - 대입 연산자
A=B에 해당합니다. 우변의 값을 좌변에 대입합니다.
int val = 10;
연산자의 종류 (이항) - 비교 연산자
== != <= < >= >에 해당합니다. 두 값을 서로 비교하고 그에 대한 논리값을 돌려줍니다.
논리 값이라고 함은, true 와 false 를 이야기하며 이는 C 에서는 false 는 0, true 는 0 이외의 값을 의미합니다.
- C++ 에서는 bool 이라는 데이터형이 존재하며 true 와 false 라는 키워드를 사용합니다. 값은 C와 같습니다.
이 연산자는 조건문에서 주로 이용됩니다.
int val = 10;
if (val == 10) // val가 10이면?
{
}
if (val < 10) // val가 10보다 작으면?
{
}
연산자의 종류 (단항, 이항) - 비트 연산자
| & ^ ~ >> <<가 해당합니다.
- |는 OR
- &는 AND
- ^는 XOR
- ~는 NOT
- >>와 <<는 SHIFT
char val=0x0F;
val = val | 0x1F;
OR 의 경우, 둘 중 하나의 bit 가 1이면 결과는 1이 됩니다.
00001111
00011111
------
111100의 결과값을 얻게 됩니다.
char val=0x0F;
val = val & 0x1F;
AND 의 경우, 둘 다 bit 가 1이면 결과가 1이 됩니다.
00001111
00011111
------
00001111의 결과값을 얻게 됩니다.
char val=0x0F;
val = val ^ 0x1F;
XOR 의 경우, 둘 개의 비트가 서로 다르면 1이 됩니다.
00001111
00011111
------
00010000 결과값을 얻게 됩니다.
char val=0x0F;
val = ~val;
NOT 의 경우, bit 가 1이면 0, 0이면 1이 됩니다.
00001111
------
11110000 결과값을 얻게 됩니다.
SHIFT 의 경우, 해당 bit 만큼 값을 데이터를 밀어 내며, <<는 좌측으로, >>는 우측으로 밀어낸다는 의미입니다.
- Value << bit 수
- 예) 4 << 2
char val=0x0F;
val = val << 2;
00001111
------
00111100 결과 값을 얻게 됩니다.
char val=0x0F;
val = val >> 2;
00001111
------
00000011 결과값을 얻게 됩니다.
처리 단위가 bit(2진수)이므로, 10 진수로 보면 한번 밀어 낼 때 마다 2배 혹은 절반의 값이 됩니다.
- 4를 좌측으로 2번 밀면 이진법상 2의 승수로 움직이게 되므로 4 * 2 * 2에 해당하여 16의 값이 됩니다.
연산자의 종류 (이항) - 복합대입 연산자
+= -= *= /= %= <<= >>= &= |= ^=에 해당합니다.
대입 연산자에 추가로 다른 연산자가 따라붙은 형태입니다.
int val = 10;
val += 1;
val -= 1;
val \*= 2;
val /= 2;
+= 의 경우 A += B이며 A에 B를 더하여 대입한다는 의미와 같습니다. 이는 A = A + B와 동일합니다.
연산자의 종류 (단항, 이항) - 논리 연산자
|| && !에 해당하고, 논리 값에 대한 처리를 합니다.
- ||는 OR
- &&는 AND,
- !는 NOT
OR 은 둘 중 하나라도 true 이면 true 를 반환하며, AND 는 둘 다 true 여야 true 를 반환합니다.
NOT 은 true 일 경우 false 를, false 일 경우 true 를 돌려줍니다.
int val = 10;
if( (val == 10) && (val != 10) )
{
}
if( (val == 10) || !(val != 10) )
{
}
첫번째 if 문은 val==10의 비교결과로 true 를 얻고, val!=10의 비교결과로 false 를 얻습니다.
- true 와 false 의 and 는 false 입니다.
두번째 if 문은 val==10의 비교결과로 true 를 얻고, (val!=10)의 비교결과로 false 를 얻은뒤 이를 not 하여 true 를 얻습니다.
- true 와 true 의 or는 true 입니다.
연산자의 종류 (삼항) - 조건 연산자
?:에 해당하며, (condition) ? val1:val2;의 식을 가집니다.
condition 이 true 라면 val1을 , false 라면 val2를 택하게 됩니다.
int result;
int val1 = 10;
int val2 = 20;
result = (val1 > val2) ? val1 : val2;
조건의 비교 결과로 val2가 val1보다 크므로, false 가 되어 val2를 result 에 대입하게 됩니다.
연산자의 종류 - 그 외 연산자
이 장에서 한번에 이해하기는 어려우므로, 다른 장들에서 별도로 설명할 것입니다.
연산자의 우선순위에 관해
연산자들의 우선순위는 프로그램 작성에서 실수를 유발할 수 있는 부분입니다.
따라서 우선순위에 의해 자동적으로 이루어지는 형태보다는, 괄호를 명시적으로 사용하는 것이 코드의 가독성에 유리하다고 생각됩니다.
- 습관과 취향의 문제로, 정답은 없습니다.
A = B + 2 * 3; 이라면, A = B + (2 * 3)의 형태로 직접 우선순위를 표기해 주는것이 추후 실수를 줄일 수 있을 것입니다.
- 괄호가 많아지면 그 역시 가독성을 떨어 뜨릴 수 있으나, 최근에는 개발 도구들이 괄호에 색상을 입혀 가독성을 높여줍니다.