15. 비교 연산자와 삼항 연산자
1. 키워드
- 비교 연산자
- 삼항 연산자
2. 비교 연산자와 삼항 연산자 사용하기
- 이번에는
if
조건문에서 사용할 수 있는 비교 연산자와 삼항 연산자를 알아보자.
- 비교 연산자는 값을 비교할 때 사용하며 연산자의 종류는 다음과 같다.
- 보통 비교 연산자는
if
조건문뿐만 아니라for
,while
,do while
반복문에서 조건식을 표현할 때도 사용한다.
- 다음은 삼항 연산자이다.
단항, 이항, 삼항 연산자
- 연산자는 연산에 필요한 값(피연산자)이 몇 개인가에 따라 단항 연산자, 이항 연산자, 삼항 연산자로 구분된다.
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
이 나온다. - 여기서는
num1
이10
이므로 결과는 다음과 같다.
1] num1 == 10
num1
이10
과 같으므로1
이다.
2] num1 != 5
num1
이5
와 다르므로1
이다.
3] num1 > 10
num1
이10
보다 크지 않으므로0
이다.
4] num1 < 10
num1
이10
보다 작지 않으므로0
이다.
5] num1 >= 10
num1
이10
보다 크거나 같으므로1
이다.
6] num1 <= 10
num1
이10
보다 작거나 같으므로1
이다.
4. 삼항 연산자 사용하기
- 먼저 삼항 연산자를 사용하기 전에
if
조건문으로num1
의 값이 참이면num2
에100
을 할당하고, 거짓이면num2
에200
을 할당하는 코드를 만들어보자.
#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
에 저장된5
는0
이 아닌 값이므로 참이다.- 따라서
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
- 삼항 연산자는
?
와:
이다. - 먼저 참/거짓을 판단할 변수나 조건식을 지정한 뒤
?
다음에 참과 거짓일 때 사용할 값을 나열한다. - 각 값은
:
로 구분하며:
앞은 참일 때,:
뒤는 거짓일 때 사용할 값이다.
num2 = num1 ? 100 : 200;
의 ?는num1
변수 자체를 참인지 거짓인지 판단한다.- 또한, 삼항 연산자는
if
조건문과 마찬가지로0
일 때 거짓,0
이 아닐 때는 참으로 동작한다. - 따라서
num1
에 들어있는5
는 참이므로:
앞의100
이 할당된다. - 만약
num1
에0
을 넣으면:
뒤의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;
과 같이?
앞에 비교 연산자==
로 조건식을 지정했다.- 여기서 조건식의 결과가 참인지 거짓인지에 따라서
:
앞뒤의 값을 사용하게 된다.
num2 = num1 == 10 ? 100 : 200;
에서num1
은10
이므로 참이다.- 따라서
num2
에는:
앞의100
이 할당되며, 만약num1
에10
이 아닌 다른 값을 넣어보면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
조건식에 비교 연산자를 사용했다.- 지금까지
if
는0
일 때 거짓,0
이 아닐 때 참으로 동작한다고 설명했다. - 여기서는 비교 연산자의 결과에 따라
if
가 동작하여 문자열이 출력된다. num1
이10
이므로 결과는 다음과 같다.
1] num1 == 10
num1
이10
과 같으므로"10입니다."
가 출력된다.
2] num1 != 5
num1
이5
와 다르므로"5가 아닙니다."
가 출력된다.
3] num1 > 10
num1
이10
보다 크지 않으므로 아무것도 출력되지 않는다.
4] num1 < 10
num1
이10
보다 작지 않으므로 아무것도 출력되지 않는다.
5] num1 >= 10
num1
이10
보다 크거나 같으므로"10보다 크거나 같습니다."
가 출력된다.
6] num1 <= 10
num1
이10
보다 작거나 같으므로"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
함수에 삼항 연산자를 바로 사용하여 결과를 출력했다.- 여기서는
num1
이5
이므로 조건식이 거짓이다. - 따라서
"10이 아닙니다."
가 출력된다. - 즉,
printf
함수에는 삼항 연산자의 결과만 들어간다. - 이처럼 삼항 연산자는 참/거짓 판단을 하면서 결괏값을 함수에 전달할 때 유용하다.