Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 삼항 연산자(?:)란? 조건 연산자의 동작 원리와 활용법

C++ 삼항 연산자(?:)란?

C++에서 조건 연산자(?:)는 흔히 삼항 연산자(ternary operator)라고 불리며, 이름 그대로 세 개의 피연산자를 받는 유일한 연산자입니다. if-else 문을 한 줄로 간결하게 표현할 수 있어 조건에 따라 값을 선택할 때 자주 사용됩니다.

조건 연산자의 동작 원리

조건 연산자는 다음과 같은 순서로 동작합니다.

  • 첫 번째 피연산자는 암묵적으로 bool 타입으로 변환됩니다. 이 값이 먼저 평가되며, 모든 부수 효과(side effect)가 완료된 후에야 다음 단계로 진행됩니다.
  • 첫 번째 피연산자가 true(1)로 평가되면 두 번째 피연산자가 평가됩니다.
  • 첫 번째 피연산자가 false(0)로 평가되면 세 번째 피연산자가 평가됩니다.

조건식의 최종 결과값은 실제로 평가된 피연산자, 즉 두 번째 또는 세 번째 피연산자의 값이 됩니다. 중요한 점은 마지막 두 피연산자 중 단 하나만 평가된다는 것입니다.

조건 연산자의 평가 과정은 생각보다 복잡하며, 위의 단계들은 간략한 소개에 불과합니다. 참고로 조건식은 오른쪽에서 왼쪽으로 결합(right-to-left associativity)되며, 첫 번째 피연산자는 반드시 정수형(integral type) 또는 포인터 타입이어야 합니다.

두 번째·세 번째 피연산자에 적용되는 형 변환 규칙

조건 연산자에서 두 번째와 세 번째 피연산자의 타입이 결정되는 방식에는 다음과 같은 규칙들이 적용됩니다.

  • 두 피연산자의 타입이 같은 경우: 결과값도 해당 타입을 가집니다.
  • 두 피연산자가 산술 타입 또는 열거형(enum)인 경우: 일반적인 산술 변환(Standard Conversions 문서에서 다룸)이 수행되어 공통 타입으로 변환됩니다.
  • 두 피연산자가 포인터 타입이거나, 하나는 포인터이고 다른 하나는 0으로 평가되는 상수식인 경우: 포인터 변환이 수행되어 공통 타입으로 변환됩니다.
  • 두 피연산자가 참조 타입인 경우: 참조 변환이 수행되어 공통 타입으로 변환됩니다.
  • 두 피연산자가 void 타입인 경우: 공통 타입은 void가 됩니다.
  • 두 피연산자가 동일한 사용자 정의 타입인 경우: 공통 타입은 해당 타입이 됩니다.
  • 피연산자들의 타입이 서로 다르고, 그중 하나라도 사용자 정의 타입인 경우: 언어 규칙에 따라 공통 타입이 결정됩니다.

예제 코드

다음은 삼항 연산자를 활용해 두 수 중 큰 값을 출력하는 간단한 예제입니다.

#include <iostream>
using namespace std;

int main() {
    int i = 1, j = 2;
    cout << ( i > j ? i : j ) << " is greater." << endl;
}

실행 결과

위 코드를 실행하면 i가 j보다 작으므로 조건식은 false가 되고, 세 번째 피연산자인 j의 값이 출력됩니다.

2 is greater.

정리

C++의 삼항 연산자(?:)는 조건문을 간결하게 표현할 수 있는 강력한 도구입니다. 단순한 값 선택 로직에서는 if-else보다 가독성이 좋지만, 조건이 복잡해지거나 중첩될 경우에는 오히려 코드 이해도를 떨어뜨릴 수 있으므로 적절히 사용하는 것이 좋습니다.