단항 연산자(Unary Operator)란 하나의 피연산자만을 대상으로 작용하여 새로운 값을 만들어내는 연산자를 말합니다. C++에서 사용되는 대표적인 단항 연산자는 다음과 같습니다.
C++의 주요 단항 연산자
역참조 연산자 (*)
포인터 변수에 작용하며, 포인터가 가리키는 주소에 저장된 값에 해당하는 l-value를 반환합니다. 이 과정을 흔히 '포인터 역참조(dereferencing)'라고 부릅니다.
주소 연산자 (&)
피연산자의 메모리 주소를 가져오는 연산자입니다. 피연산자는 함수 지정자이거나, 비트 필드(bit-field)가 아니며 register 저장소 클래스 지정자로 선언되지 않은 객체를 나타내는 l-value여야 합니다.
단항 플러스 연산자 (+)
피연산자의 값을 그대로 반환합니다. 피연산자는 반드시 산술(arithmetic) 타입이어야 합니다.
단항 마이너스 연산자 (-)
피연산자의 부호를 반전시키는 연산자입니다. 피연산자는 어떤 산술 타입이든 가능하며, 연산 결과는 l-value가 아닙니다.
논리 부정 연산자 (!)
피연산자의 진릿값을 뒤집는 연산자입니다. 피연산자는 산술 타입 또는 포인터 타입(혹은 이들 타입으로 평가되는 표현식)이어야 하며, 연산 시 암묵적으로 bool 타입으로 변환됩니다.
1의 보수 연산자 (~)
'비트별 보수(Bitwise Complement)' 또는 '비트별 NOT' 연산자라고도 불리며, 피연산자의 각 비트를 반전시킨 1의 보수를 생성합니다. 피연산자는 정수형(integral type)이어야 합니다.
전위 증가 연산자 (++)
피연산자에 1을 더하며, 증가된 값이 곧 표현식의 결과가 됩니다. 피연산자는 const가 아닌 l-value여야 하고, 결과 역시 피연산자와 같은 타입의 l-value입니다.
전위 감소 연산자 (--)
피연산자에서 1을 빼며, 감소된 값이 표현식의 결과가 됩니다. 피연산자는 const가 아닌 l-value여야 하고, 결과 역시 피연산자와 같은 타입의 l-value입니다.
형 변환 연산자 ()
특정 상황에서 객체의 타입을 명시적으로 변환할 수 있게 해주는 방법입니다. 형 변환이 수행된 후에는 컴파일러가 해당 표현식을 지정한 타입(type-name)으로 취급합니다.
sizeof 연산자
컴파일 시간(compile time)에 피연산자의 크기를 계산할 수 있는 단항 연산자입니다.
new 연산자
메모리를 동적으로 할당할 때 사용되는 메모리 할당 연산자입니다.
delete 연산자
동적으로 할당된 메모리를 해제할 때 사용되는 메모리 해제 연산자입니다.
결합 방향(Associativity)
이러한 단항 연산자들은 모두 오른쪽에서 왼쪽으로 결합(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로 형 변환되어 1이 되고, 단항 마이너스 연산자에 의해 -1이 최종 출력되는 것을 확인할 수 있습니다.