C++/C++ 기초

[C++] 연산자 총 정리 (Operator)

Song 컴퓨터공학 2023. 5. 4. 12:23

C++ 은 여러 종류의 연산을 위해 다양한 연산자(operator) 을 제공합니다. C++ 의 연산자를 총 정리하는 포스팅입니다.

 

  1. 산술 연산자(arithmetic operator)
  2. 대입 연산자(assignment operator)
  3. 증감 연산자(increment and decrement operator)
  4. 비교 연산자(comparison operator)
  5. 논리 연산자(logical operator)
  6. 비트 연산자(bitwise operator)
  7. 삼항 연산자
  8. sizeof 연산자
  9. 범위 지정 연산자(scope resolution operator)
  10. 멤버 포인터 연산자(pointer-to-member operator)
  11. typeid 연산자
  12. 연산자의 우선순위(operator precedence)와 결합 방향(associativity)

 

 

산술 연산자(arithmetic operator)

 

사칙연산을 다루는 기본적이고 가장 많이 사용되는 산술 연산자입니다.

산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.

 

+ 왼쪽의 피연산자에 오른쪽의 피연산자를 더함.
- 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌.
* 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함.
/ 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔.
% 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 반환함.

 

 

대입 연산자(assignment operator)

 

대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자입니다. 피연산자들의 결합 방향은 오른쪽에서 왼쪽입니다. 또한 산술 연산자와 결합한 복합 대입 연산자가 존재합니다. 엄청 자주 쓰이니 복합 대입 연산자는 필수적으로 알아야 합니다.

 

= 왼쪽의 피연산자에 오른쪽의 피연산자를 대입함.
+= 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
-= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
*= 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
/= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
%= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함.

 

 

증감 연산자(increment and decrement operator)

 

증감 연산자는 피연산자를 1씩 증가 시키거나 감소시키는 연산자로, 피연산자가 하나인 단항 연산자입니다.

 

증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서와 결과가 달라집니다.

++x 먼저 피연산자의 값을 1 증가시킨 후에 해당 연산을 진행함.
x++ 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 증가시킴.
--x 먼저 피연산자의 값을 1 감소시킨 후에 해당 연산을 진행함.
x-- 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 감소시킴.

 

전위 증감 연산자와 후위 증감 연산자에 대한 이해를 꼭 하고 넘어가야 합니다.

 

 

비교 연산자(comparison operator)

 

비교 연산자는 피연산자 사이의 상대적 크기를 판단하는 연산자입니다. 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.

== 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 1을 반환함.
!= 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 1을 반환함.
> 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 1을 반환함.
>= 왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 1을 반환함.
< 왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 1을 반환함.
<= 왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 1을 반환함.

C 와 마찬가지로 C++ 에서 False 는 0 이며, 0 이 아닌 모든 값은 참(True) 로 간주됩니다.

 

 

논리 연산자(logical operator)

 

논리 연산자는 주어진 논리식을 판단하여, 참(true) 와 거짓(false) 를 결정하는 연산자입니다.

AND 와 OR 연산은 두 개의 피연산자를 가지며, 피연산자의 결합 방향은 왼쪽에서 오른쪽입니다.

NOT 연산자는 피연산자가 하나인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽입니다.

&& 논리식이 모두 참이면 1을 반환함. (논리 AND 연산)
|| 논리식 중에서 하나라도 참이면 1을 반환함. (논리 OR 연산)
! 논리식의 결과가 참이면 0을, 거짓이면 1을 반환함. (논리 NOT 연산)

 

 

비트 연산자(bitwise operator)

 

비트 연산자는 논리 연산자와 비슷하지만, 비트 단위로 논리 연산을 하는 연산자입니다. 비트 단위로 bit shifting 을 하거나, 1의 보수를 만들 때 사용합니다.

& 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
| 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산, 1의 보수)
<< 지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산)
>> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)

 

 

삼항 연산자(ternary operator)

 

삼항 연산자에는 C와 C++ 에만 존재하는 독특한 연산자입니다. 유일하게 C++ 에서 피연산자를 3개를 가집니다.

조건식 ? 반환값1 : 반환값2

물음표 앞의 조건식의 결과에 따라 참(True) 이면 반환값1 을 반환하고, 거짓(False) 이면 반환값2를 반환합니다. 이를 이용하면 간단한 조건문은 if 문 없이 코드 한 줄로 대체할 수 있고, 굉장히 유용하게 사용되는 연산자입니다.

 

 

sizeof 연산자

 

컴퓨팅 환경에 따라 타입에 할당되는 메모리의 크기가 달라질 수 있습니다. 그 때 확인하는 방법은 sizeof() 인데요, 이를 함수로 아시는 분들도 많은데 sizeof 는 단항 연산자로 피연산자의 크기를 바이트 단위로 반환하는 연산자입니다.

 

이 연산자의 피연산자로는 타입 뿐 아니라 변수나 상수도 올 수 있습니다. sizeof 연산자에 변수나 상수가 피연산자로 전달되면 해당 변수나 상숫값에 해당하는 타입의 크기를 반환합니다.

 

 

범위 지정 연산자(scope resolution operator)

 

마지막에서 우선순위에 대해 알아볼껀데, C++ 에서 가장 우선순위가 높은 연산자는 범위 지정 연산자입니다.

범위 지정 연산자(::) 는 여러 범위에서 사용된 식별자를 식별하고 구분하는데 사용됩니다.

 

이러한 식별자로는 변수, 함수, 또는 열거체가 올 수 있습니다.

 

범위 지정 연산자를 변수 이름 앞에 붙이면 해당 변수는 전역으로 사용한다는 의미가 됩니다. 또한 클래스에 이 연산자를 사용하면 네임스페이스의 멤버를 식별하거나, 클래스의 정적 멤버를 호출할 수 있습니다. 문법은 아래와 같습니다.

::식별자
클래스이름::식별자
네임스페이스::식별자
열거체::식별자

 

 

멤버 포인터 연산자(pointer-to-member operator)

 

C에는 없고 C++ 에만 존재하는 연산자로, 멤버 포인터 연산자를 사용해 클래스의 멤버를 가리키는 포인터를 정의할 수 있습니다. 두 가지 형태가 존재합니다.

 

1. 왼쪽의 피연산자가 클래스 타입의 객체인 경우 : .*

2. 왼쪽의 피연산자가 클래스 타입의 객체를 가리키는 포인터인 경우 : ->*

 

문법은 아래와 같습니다.

클래스타입의객체.*멤버이름
클래스타입객체의포인터->*멤버이름

 

 

typeid 연산자

 

C++에서는 typeid 연산자를 사용해 객체의 타입에 대한 정보를 알 수 있습니다. typeid 연산자는 런타임에 객체의 타입을 결정하는 데 사용하고, 또한 템플릿에서 템플릿 매개변수의 타입을 결정할 때도 사용합니다.

typeid(표현식)

 

 

연산자의 우선순위(operator precedence)와 결합 방향(associativity)

 

연산자의 우선순위는 수식 내에 여러 연산자가 함께 등장할 때, 어느 연산자가 먼저 처리될 것인가를 결정합니다.

아래에 연산자의 우선순위 표를 올려놓았습니다. 우선순위가 빠른 연산자가 가장 먼저 실행됩니다.

C++ 연산자의 우선순위표

1 :: 범위 지정 연산자 -
2 ++ 후위 증가 연산자 왼쪽에서 오른쪽으로
  -- 후위 감소 연산자 왼쪽에서 오른쪽으로
  () 함수 호출 왼쪽에서 오른쪽으로
  [] 첨자 연산자 왼쪽에서 오른쪽으로
  . 멤버 연산자 왼쪽에서 오른쪽으로
  -> 멤버 접근 연산자 왼쪽에서 오른쪽으로
  typeid 타입 인식 왼쪽에서 오른쪽으로
  const_cast 상수 타입 변환 왼쪽에서 오른쪽으로
  dynamic_cast 동적 타입 변환 왼쪽에서 오른쪽으로
  reinterpret_cast 재해석 타입 변환 왼쪽에서 오른쪽으로
  static_cast 정적 타입 변환 왼쪽에서 오른쪽으로
3 ! 논리 NOT 연산자 오른쪽에서 왼쪽으로
  ~ 비트 NOT 연산자 오른쪽에서 왼쪽으로
  + 양의 부호 (단항 연산자) 오른쪽에서 왼쪽으로
  - 음의 부호 (단항 연산자) 오른쪽에서 왼쪽으로
  ++ 전위 증가 연산자 오른쪽에서 왼쪽으로
  -- 전위 감소 연산자 오른쪽에서 왼쪽으로
  (타입) 타입 캐스트 연산자 오른쪽에서 왼쪽으로
  * 참조 연산자 (단항 연산자) 오른쪽에서 왼쪽으로
  & 주소 연산자 (단항 연산자) 오른쪽에서 왼쪽으로
  sizeof 크기 연산자 오른쪽에서 왼쪽으로
  new 객체 생성 오른쪽에서 왼쪽으로
  delete 객체 제거 오른쪽에서 왼쪽으로
4 .* 멤버 포인터 연산자 왼쪽에서 오른쪽으로
  ->* 참조 멤버 포인터 연산자 왼쪽에서 오른쪽으로
5 * 곱셈 연산자 왼쪽에서 오른쪽으로
  / 나눗셈 연산자 왼쪽에서 오른쪽으로
  % 나머지 연산자 왼쪽에서 오른쪽으로
6 + 덧셈 연산자 (이항 연산자) 왼쪽에서 오른쪽으로
  - 뺄셈 연산자 (이항 연산자) 왼쪽에서 오른쪽으로
7 << 비트 왼쪽 시프트 연산자 왼쪽에서 오른쪽으로
  >> 부호 비트를 확장하면서 비트 오른쪽 시프트 왼쪽에서 오른쪽으로
8 < 관계 연산자(보다 작은) 왼쪽에서 오른쪽으로
  <= 관계 연산자(보다 작거나 같은) 왼쪽에서 오른쪽으로
  > 관계 연산자(보다 큰) 왼쪽에서 오른쪽으로
  >= 관계 연산자(보다 크거나 같은) 왼쪽에서 오른쪽으로
9 == 관계 연산자(와 같은) 왼쪽에서 오른쪽으로
  != 관계 연산자(와 같지 않은) 왼쪽에서 오른쪽으로
10 & 비트 AND 연산자 왼쪽에서 오른쪽으로
11 ^ 비트 XOR 연산자 왼쪽에서 오른쪽으로
12 | 비트 OR 연산자 왼쪽에서 오른쪽으로
13 && 논리 AND 연산자 왼쪽에서 오른쪽으로
14 || 논리 OR 연산자 왼쪽에서 오른쪽으로
15 ? : 삼항 조건 연산자 오른쪽에서 왼쪽으로
16 = 대입 연산자 및 복합 대입 연산자
(=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=)
오른쪽에서 왼쪽으로
17 throw 예외 발생 왼쪽에서 오른쪽으로
18 , 쉼표 연산자 왼쪽에서 오른쪽으로