20.2 삼항 연산자 사용하기

먼저 삼항 연산자를 사용하기 전에 if 조건문으로 num1의 값이 참이면 num2에 100을 할당하고, 거짓이면 num2에 200을 할당하는 코드를 만들어보겠습니다.

if_else.c

#include <stdio.h>
 
int main()
{
    int num1 = 5;
    int num2;
 
    if (num1)          // num1이 참이면 
        num2 = 100;    // num2에 100을 할당
    else               // num1이 거짓이면
        num2 = 200;    // num2에 200을 할당
 
    printf("%d\n", num2); // 100: num1이 5이므로 참. num2에는 100이 할당됨
 
    return 0;
}

실행 결과

100

num1에 저장된 5는 0이 아닌 값이므로 참입니다. 따라서 num2에는 100이 할당됩니다.

이제 앞의 if조건문을 삼항 연산자로 작성해보겠습니다. 삼항 연산자는 다음과 같은 형식으로 사용합니다.

  • 변수 ? 값1 : 값2

ternary_conditional_operator.c

#include <stdio.h> 

int main()
{
    int num1 = 5;
    int num2;
 
    num2 = num1 ? 100 : 200;    // num1이 참이면 num2에 100을 할당, 거짓이면 num2에 200을 할당
 
    printf("%d\n", num2);    // 100: num1이 5이므로 참. num2에는 100이 할당됨
 
    return 0;
}

실행 결과

100

삼항 연산자는 ?:입니다. 먼저 참/거짓을 판단할 변수나 조건식을 지정한 뒤 ? 다음에 참과 거짓일 때 사용할 값을 나열합니다. 각 값은 :로 구분하며 : 앞은 참일 때, : 뒤는 거짓일 때 사용할 값입니다.

그림 20‑1 삼항 연산자

num2 = num1 ? 100 : 200;?num1 변수 자체를 참인지 거짓인지 판단합니다. 또한, 삼항 연산자는 if조건문과 마찬가지로 0일 때 거짓, 0이 아닐 때는 참으로 동작합니다. 따라서 num1에 들어있는 5는 참이므로 : 앞의 100이 할당됩니다. 만약 num10을 넣으면 : 뒤의 200이 할당됩니다.

즉, 삼항 연산자는 참, 거짓에 따라 다른 값을 사용하게 해주며 if, else로 분기하는 부분을 한 줄로 간단하게 줄일 수 있습니다.

이번에는 비교 연산자와 삼항 연산자를 함께 사용해보겠습니다.

comparison_ternary_conditional_operator.c

#include <stdio.h>
 
int main()
{
    int num1 = 10;
    int num2;
 
    num2 = num1 == 10 ? 100 : 200; // num1이 10이면 num2에 100을 할당, 10이 아니면 num2에 200을 할당
 
    printf("%d\n", num2);    // 100: num1이 10이므로 num2에는 100이 할당됨
 
    return 0;
}

실행 결과

100

num1 == 10 ? 100 : 200;과 같이 ? 앞에 비교 연산자 ==로 조건식을 지정했습니다. 여기서는 조건식의 결과가 참인지 거짓인지에 따라서 : 앞뒤의 값을 사용하게 됩니다.

그림 20‑2 조건식과 삼항 연산자

num2 = num1 == 10 ? 100 : 200에서 num110 이므로 참입니다. 따라서 num2에는 : 앞의 100이 할당됩니다. 만약 num110이 아닌 다른 값을 넣어보면 200이 할당됩니다.

예제에서는 ===이 연달아서 나오므로 헷갈리기 쉽습니다. 따라서 다음과 같이 조건식 부분을 괄호로 묶어주면 읽기가 쉬워지고, 코드의 의도를 명확하게 드러낼 수 있습니다.

num2 = (num1 == 10) ? 100 : 200;
참고 | 삼항 연산자와 가독성

삼항 연산자는 if 조건문을 짧게 표현할 수 있는 장점이 있지만, 축약된 형식이기 때문에 가독성을 해치기도 합니다. 특히 한 줄에 조건식과 결괏값들이 모두 모여있으므로 디버거로 줄 단위 디버깅을 할 때 상당히 불편합니다.

따라서 가독성을 해치지 않으면서 코드가 간결해지는 경우에만 삼항 연산자를 써야 합니다. 대부분의 경우에는 if 조건문을 사용하여 여러 줄로 작성하는 것이 좋습니다.

코드를 암호처럼 복잡하게 만드는 것이 실력이 아닙니다. 나와 다른 사람이 알아보기 쉽게 만드는 것이 진짜 실력임을 잊지 마세요.