Skip to content

15. 비교 연산자와 삼항 연산자


1. 키워드

  • 비교 연산자
  • 삼항 연산자


2. 비교 연산자와 삼항 연산자 사용하기

  • 이번에는 if 조건문에서 사용할 수 있는 비교 연산자와 삼항 연산자를 알아보자.


  • 비교 연산자는 값을 비교할 때 사용하며 연산자의 종류는 다음과 같다.


001


  • 보통 비교 연산자는 if 조건문뿐만 아니라 for, while, do while 반복문에서 조건식을 표현할 때도 사용한다.


  • 다음은 삼항 연산자이다.


002


단항, 이항, 삼항 연산자

  • 연산자는 연산에 필요한 값(피연산자)이 몇 개인가에 따라 단항 연산자, 이항 연산자, 삼항 연산자로 구분된다.


1] 단항 연산자

  • 연산에 필요한 값이 한 개이다.
  • +x, -x (부호 붙이기)
  • ++x, x++

2] 이항 연산자

  • 연산에 필요한 값이 두 개이며 사칙 연산이 대표적이다.
  • a + b, a += b, a = b, a == b

3] 삼항 연산자

  • 연산에 필요한 값이 세 개이다.
  • x ? a : b


3. 비교 연산자 사용하기

  • 다음 내용을 입력한 뒤 실행해 보자.


#include <stdio.h>

int main()
{
    int num1 = 10;

    printf("%d\n", num1 == 10); // num1이 10과 같은지
    printf("%d\n", num1 != 5);  // num1이 5와 다른지

    printf("%d\n", num1 > 10); // num1이 10보다 큰지
    printf("%d\n", num1 < 10); // num1이 10보다 작은지

    printf("%d\n", num1 >= 10); // num1이 10보다 크거나 같은지
    printf("%d\n", num1 <= 10); // num1이 10보다 작거나 같은지

    return 0;
}

// 1
// 1
// 0
// 0
// 1
// 1


  • C에서는 비교 연산자가 참이면 1, 거짓이면 0이 나온다.
  • 여기서는 num110이므로 결과는 다음과 같다.


1] num1 == 10

  • num110과 같으므로 1이다.

2] num1 != 5

  • num15와 다르므로 1이다.

3] num1 > 10

  • num110보다 크지 않으므로 0이다.

4] num1 < 10

  • num110보다 작지 않으므로 0이다.

5] num1 >= 10

  • num110보다 크거나 같으므로 1이다.

6] num1 <= 10

  • num110보다 작거나 같으므로 1이다.


4. 삼항 연산자 사용하기

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


#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); // num1이 5이므로 참. num2에는 100이 할당됨

    return 0;
}

// 100


  • num1에 저장된 50이 아닌 값이므로 참이다.
  • 따라서 num2에는 100이 할당된다.


  • 이제 앞의 if 조건문을 삼항 연산자로 작성해 보자.


#include <stdio.h>

int main()
{
    int num1 = 5;
    int num2;

    num2 = num1 ? 100 : 200; // num1이 참이면 num2에 100을 할당, 거짓이면 num2에 200을 할당

    printf("%d\n", num2); // num1이 5이므로 참. num2에는 100이 할당됨

    return 0;
}

// 100


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


003


  • num2 = num1 ? 100 : 200;의 ?는 num1 변수 자체를 참인지 거짓인지 판단한다.
  • 또한, 삼항 연산자는 if 조건문과 마찬가지로 0일 때 거짓, 0이 아닐 때는 참으로 동작한다.
  • 따라서 num1에 들어있는 5는 참이므로 : 앞의 100이 할당된다.
  • 만약 num10을 넣으면 : 뒤의 200이 할당된다.
  • 즉, 삼항 연산자는 참, 거짓에 따라 다른 값을 사용하게 해주며 if, else로 분기하는 부분을 한 줄로 간단하게 줄일 수 있다.


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


#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); // num1이 10이므로 num2에는 100이 할당됨

    return 0;
}

// 100


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


004


  • num2 = num1 == 10 ? 100 : 200;에서 num110이므로 참이다.
  • 따라서 num2에는 : 앞의 100이 할당되며, 만약 num110이 아닌 다른 값을 넣어보면 200이 할당된다.


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


num2 = (num1 == 10) ? 100 : 200;


삼항 연산자와 가독성

  • 삼항 연산자는 if 조건문을 짧게 표현할 수 있는 장점이 있지만, 축약된 형식이기 때문에 가독성을 해치기도 한다.
  • 특히 한 줄에 조건식과 결괏값들이 모두 모여있으므로 디버거로 줄 단위 디버깅을 할 때 상당히 불편하다.
  • 따라서 가독성을 해치치 않으면서 코드가 간결해지는 경우에만 삼항 연산자를 써야 한다.
  • 대부분의 경우에는 if 조건문을 사용하여 여러 줄로 작성하는 것이 좋다.


5. if 조건문과 비교 연산자 사용하기

  • 이제 if 조건문과 비교 연산자를 함께 사용해 보자.


#include <stdio.h>

int main()
{
    int num1 = 10;

    if (num1 == 10) // num1이 10과 같은지 검사
        printf("10입니다.\n");

    if (num1 != 5) // num1이 5와 다른지 검사
        printf("5가 아닙니다.\n");

    if (num1 > 10) // num1이 10보다 큰지 검사
        printf("10보다 큽니다.\n");

    if (num1 < 10) // num1이 10보다 작은지 검사
        printf("10보다 작습니다.\n");

    if (num1 >= 10) // num1이 10보다 크거나 같은지 검사
        printf("10보다 크거나 같습니다.\n");

    if (num1 <= 10) // num1이 10보다 작거나 같은지 검사
        printf("10보다 작거나 같습니다.\n");

    return 0;
}

// 10입니다.
// 5가 아닙니다.
// 10보다 크거나 같습니다.
// 10보다 작거나 같습니다.


  • if 조건식에 비교 연산자를 사용했다.
  • 지금까지 if0일 때 거짓, 0이 아닐 때 참으로 동작한다고 설명했다.
  • 여기서는 비교 연산자의 결과에 따라 if가 동작하여 문자열이 출력된다.
  • num110이므로 결과는 다음과 같다.


1] num1 == 10

  • num110과 같으므로 "10입니다."가 출력된다.

2] num1 != 5

  • num15와 다르므로 "5가 아닙니다."가 출력된다.

3] num1 > 10

  • num110보다 크지 않으므로 아무것도 출력되지 않는다.

4] num1 < 10

  • num110보다 작지 않으므로 아무것도 출력되지 않는다.

5] num1 >= 10

  • num110보다 크거나 같으므로 "10보다 크거나 같습니다."가 출력된다.

6] num1 <= 10

  • num110보다 작거나 같으므로 "10보다 작거나 같습니다."가 출력된다.


  • 정수뿐만 아니라 실수나 문자도 비교 연산자로 비교할 수 있다.


#include <stdio.h>

int main()
{
    float num1 = 0.1f;
    char c1 = 'a';

    if (num1 >= 0.09f) // num1이 실수 0.09보다 크거나 같은지 검사
        printf("0.09보다 크거나 같습니다.\n");

    if (c1 == 'a') // c1이 문자 a와 같은지 검사
        printf("a입니다.\n");

    if (c1 == 97) // c1이 정수 97과 같은지 검사
        printf("97입니다.\n");

    if (c1 < 'b') // c1이 문자 b보다 작은지 검사
        printf("b보다 작습니다.\n");

    return 0;
}

// 0.09보다 크거나 같습니다.
// a입니다.
// 97입니다.
// b보다 작습니다.


  • 문자 자료형은 c1 == 'a'처럼 문자 그대로 비교할 수 있다.
  • 또한, 문자 자료형은 정수이므로 숫자로 직접 비교하거나 대소 관계를 비교할 수도 있다.
  • 단, 실수는 반올림 오차가 발생하므로 == 연산자로 정확한 값을 비교하는 것은 위험하다.


6. 함수 안에서 삼항 연산자 사용하기

  • 이번에는 삼항 연산자를 함수에 바로 사용해 보자.


#include <stdio.h>

int main()
{
    int num1 = 5;

    // 함수 안에서 삼항 연산자 사용
    printf("%s\n", num1 == 10 ? "10입니다." : "10이 아닙니다."); // num1은 5이므로 "10이 아닙니다." 출력

    return 0;
}


  • printf 함수에 삼항 연산자를 바로 사용하여 결과를 출력했다.
  • 여기서는 num15이므로 조건식이 거짓이다.
  • 따라서 "10이 아닙니다."가 출력된다.
  • 즉, printf 함수에는 삼항 연산자의 결과만 들어간다.
  • 이처럼 삼항 연산자는 참/거짓 판단을 하면서 결괏값을 함수에 전달할 때 유용하다.

References