이 글에서는 C/C++의 단항 연산자(Unary Operator)에 대해 자세히 알아봅니다. 단항 연산자란 하나의 피연산자(operand)에만 작용하여 새로운 값을 만들어내는 연산자를 말합니다. C/C++에서 제공하는 대표적인 단항 연산자는 다음과 같습니다.
C/C++ 단항 연산자의 종류
| 연산자 | 설명 |
|---|---|
| 역참조 연산자 (*) | 포인터 변수에 작용하여, 해당 포인터 주소에 저장된 값에 대응하는 l-value를 반환합니다. 이를 포인터의 "역참조(dereferencing)"라고 부릅니다. |
| 주소 연산자 (&) | 피연산자의 메모리 주소를 가져옵니다. 피연산자는 함수 지정자이거나, 비트 필드(bit-field)가 아니며 register 저장 클래스 지정자로 선언되지 않은 객체를 가리키는 l-value여야 합니다. |
| 단항 플러스 연산자 (+) | 피연산자의 값을 그대로 반환합니다. 피연산자는 반드시 산술(arithmetic) 타입이어야 합니다. |
| 단항 마이너스 연산자 (-) | 피연산자 값의 부호를 반전(negate)합니다. 피연산자는 임의의 산술 타입일 수 있으며, 연산 결과는 l-value가 아닙니다. |
| 논리 부정 연산자 (!) | 피연산자의 진릿값을 뒤집습니다. 피연산자는 산술 타입 또는 포인터 타입(혹은 그것으로 평가되는 표현식)이어야 하며, 암묵적으로 bool 타입으로 변환된 후 연산이 수행됩니다. |
| 1의 보수 연산자 (~) | "비트별 보수(bitwise complement)" 또는 "비트별 NOT" 연산자라고도 하며, 피연산자의 각 비트를 반전한 1의 보수를 생성합니다. 피연산자는 정수(integer) 타입이어야 합니다. |
| 전위 증가 연산자 (++) | 피연산자에 1을 더하고, 증가된 값이 곧 표현식의 결과가 됩니다. 피연산자는 const가 아닌 l-value여야 하며, 결과는 피연산자와 같은 타입의 l-value입니다. |
| 전위 감소 연산자 (--) | 피연산자에서 1을 빼고, 감소된 값이 곧 표현식의 결과가 됩니다. 피연산자는 const가 아닌 l-value여야 하며, 결과는 피연산자와 같은 타입의 l-value입니다. |
| 캐스트 연산자 () | 특정 상황에서 객체의 타입을 명시적으로 변환(explicit conversion)하는 방법을 제공합니다. 형 변환이 수행된 후에는 컴파일러가 캐스트 표현식을 지정된 타입(type-name)으로 취급합니다. |
| sizeof 연산자 | 컴파일 시간(compile-time)에 피연산자의 크기(바이트 단위)를 계산할 수 있는 단항 연산자입니다. |
| new 연산자 | 힙(heap) 영역에 메모리를 동적으로 할당할 때 사용하는 메모리 할당 연산자입니다. |
| delete 연산자 | new로 동적 할당된 메모리를 해제할 때 사용하는 메모리 해제 연산자입니다. |
이러한 단항 연산자들은 모두 오른쪽에서 왼쪽으로 결합(right-to-left associativity)되는 특징을 가집니다. 또한 단항 표현식은 일반적으로 후위(postfix) 표현식이나 기본(primary) 표현식 앞에 위치하는 구문 형태로 구성됩니다.
예제 코드
아래 예제를 통해 단항 마이너스(-) 연산자와 캐스트() 연산자의 실제 동작을 확인해 보겠습니다.
#include<iostream>
using namespace std;
int main() {
int x;
float y = 1.23;
x = (int) y; // 캐스트 연산자: float을 int로 명시적 변환
x = -x; // 단항 마이너스 연산자: 부호 반전
cout << x;
return 0;
}
실행 결과
-1
코드 설명: 먼저 float 타입 변수 y(값 1.23)를 캐스트 연산자 (int)를 사용해 int 타입으로 명시적으로 변환하여 소수점 이하가 잘린 1이 됩니다. 이후 단항 마이너스 연산자 -가 적용되어 부호가 반전되므로 최종 출력 결과는 -1이 됩니다.