9. 연산자 소개 및 단항, 산술 연산자 사용하기
이번 강의는 데이터를 가공하는데 사용되는 C 언어의 풍부한 연산자에 대해서 다룹니다.
> // 연산자(Operator): 데이터와 변수를 가지고 더하기(+), 빼기(-)와 같은 연산 작업을 수행
미리보기 강의: 산술 연산자(Arithmetic Operator) 의사 코드로 소개
9.1 연산자
데이터를 가지고 연산 작업을 수행하고자 할 때 연산자(Operator)를 사용합니다. 연산자는 기능에 따라 대입, 산술, 관계, 논리, 증감, 조건, 비트, 시프트 연산자 등으로 나뉘며 이용 형태에 따라 한 개의 항을 가지고 연산을 하는 단항(Unary) 연산자와 두 개의 항을 연산하는 이항(Binary) 연산자와 세 개의 항을 연산하는 삼항(Ternary) 연산자로 나뉩니다.
그림: 연산자
9.1.1 연산자와 피연산자
연산자에는 연산자와 피연산자가 있습니다. 예를 들어 다음과 같은 코드가 있다고 가정합니다.
코드
int num = 1000;
int number = num + 1234;
+
기호를 연산자(operator)라고 하고 num
과 1234
는 피연산자(operand)라고 합니다.
9.1.2 식과 문
하나의 값 또는 연산을 진행하는 구문의 계산식을 식(Expression) 또는 표현식이라고 합니다. 예를 들어 3 + 5
와 같은 코드는 식입니다. 표현식을 사용하여 하나의 명령을 진행하는 구문을 문(Statement) 또는 문장이라고 합니다. 예들 들어 x = 3 + 5;
와 같은 코드가 바로 문입니다.
식
과 문
을 사용하는 예를 다음 코드로 살펴봅니다.
코드: operator_description.c
//[?] 연산자(Operator): 더하기, 빼기와 같은 연산을 진행하는 키워드
#include <stdio.h>
int main(void)
{
//[?] 식(Expression)
printf("%d\n", 3 + 5); // 8
printf("%d\n", 3 - 5); // -2
//[?] 문(Statement)
printf("%d\n", 3 * 5); // 15
printf("%d\n", 3 / 5); // 0
return 0;
}
8
-2
15
0
3 + 5 형태를 식이라고 하고 일반적으로 세미콜론으로 구분되는 하나의 문장을 문이라고 합니다.
9.2 단항 연산자(Unary Operator)
단항 연산자는 하나의 연산자로 식을 처리합니다. 단항 연산자의 가장 기본인 +
연산자와 -
연산자를 먼저 살펴보겠습니다. +
연산자와 -
연산자는 부호 연산자라고도 합니다.
+
연산자: 특정 정수형 변수의 값을 그대로 출력합니다. 사실, 단항 연산자인 + 연산자는 아무런 기능을 하지는 않습니다.-
연산자: 특정 정수형 변수의 값을 음수로 변경하여 출력합니다. 만약, 음수의 값이 들어 있다면 양수로 변환해서 반환해 줍니다.
9.2.1 단항 연산자 사용하기
이번에는 단항 연산자를 사용해보겠습니다.
코드: unary_operator.c
//[?] 단항 연산자(Unary Operator): +, -
#include <stdio.h>
int main(void)
{
int value = 0;
value = 8; // value에 8 대입
value = +value; // value의 값에 + 기호로 붙여 있는 그대로 표현
printf("%d\n", value); // +8
value = -8; // value에 -8 대입
value = +value; // value의 값에 + 기호를 붙여 있는 그대로 표현
printf("%d\n", value); // -8
value = 8; // value에 8 대입
value = -value; // value의 값에 - 기호를 붙여 부호를 반대로 변경
printf("%d\n", value); // -8
value = -8; // value에 -8 대입
value = -value; // value의 값에 - 기호를 붙여 부호를 반대로 변경
printf("%d\n", value); // +8
return 0;
}
8
-8
-8
8
+
연산자는 변수의 값을 그대로 반환해 줍니다. 이와 달리 –
연산자는 변수의 값의 부호를 반대로 변경해 줍니다.
9.2.2 주소 연산자: &
특정 변수에 &(앰퍼샌드) 기호를 붙이면 해당 변수에 들어있는 값이 아닌 해당 변수가 컴퓨터 메모리상의 어느 주소에 저장되었는지를 알려주는 주솟값 자체를 알려줍니다. 이 값은 매번 실행할 때마다 달라질 수 있습니다. 지금은 변수 이름에 & 기호를 붙이면 값이 아닌 주소를 알려주는 내용만 기억합니다.
코드: address_operator.c
#include <stdio.h>
int main(void)
{
int number = 1234;
printf("number 변수에 들어 있는 값: %d, number 변수의 주솟값: %p\n"
, number, &number); // 주소는 계속 변경됨
return 0;
}
number 변수에 들어 있는 값: 1234, number 변수의 주솟값: 00AFFA94
변수의 주소를 출력할 때에는 서식 지정자로 %d
보다는 %p
를 사용합니다.
9.3 변환 연산자: 소괄호 기호를 사용하여 데이터 타입 변환
()
기호를 사용하여 특정 값을 원하는 데이터 타입으로 변환할 수 있습니다. (int)3.14
형태를 사용하면 실수 리터럴인 3.14
를 정수형으로 변환해서 3
을 반환해 줍니다.
변환 연산자를 사용해 보겠습니다.
코드: casting_operator.c
#include <stdio.h>
int main(void)
{
int number = (int)3.14; // 3.14를 정수(int)로 변환
printf("%d\n", number); // 3
return 0;
}
3
실수 데이터 타입인 3.14를 (int)를 붙여 정수 데이터 타입 변수에 담았습니다.
변환 연산자는 (long), (double) 형태로도 사용됩니다.
long number = (long)3.141592;
double number = (double)3.141592;
9.4 산술 연산자(Arithmetic Operator)
이번에는 사칙역산을 할 수 있는 방법을 알아보겠습니다. C 언어에서는 사칙연산을 위해서 산술 연산자(Arithmetic Operator)를 제공합니다. 산술 연산자는 더하기(Add), 빼기(Subtract), 곱하기(Multiply), 나누기(Divide), 나머지(Remainder, Modulus)의 수학적 연산을 하는데 사용됩니다.
산술 연산자는 영어로 Mathematical
연산자로도 표현합니다.
산술 연산자는 다음과 같이 5가지 종류가 있습니다.
+ (더하기), - (빼기), * (곱하기), / (나누기), % (나머지)
다음은 산술 연산자 사용 예입니다.
연산자 | 의미 | 설명 |
---|---|---|
A + B | 더하기 | A와 B를 더한 결과를 반환합니다. |
A - B | 빼기 | A에서 B를 뺀 결과를 반환합니다. |
A * B | 곱하기 | A와 B를 곱한 결과를 반환합니다. |
A / B | 나누기 | A를 B로 나눈 결과를 반환합니다. |
A % B | 나머지 | A를 B로 나눈 후, 몫이 아닌 정수형 나머지 값을 반환합니다. |
다음 샘플 코드는 +
연산자를 사용하여 더한 값을 출력한 내용입니다.
코드: plus_operator.c
#include <stdio.h>
int main(void)
{
int i = 10;
int j = 20;
int k = i + j; // k = 10 + 20
printf("%d\n", k); // 30
return 0;
}
30
9.4.1 더하기 연산자: +
먼저, 더하기 연산자를 사용해보겠습니다.
코드: operator_add.c
//[?] 더하기(+) 연산자
#include <stdio.h>
int main(void)
{
int i = 10;
int j = 20;
int k = i + j; // k = 10 + 20
printf("%d\n", k); // 30
return 0;
}
30
k
변수에는 i
와 j
변수에 있는 값을 더한 후 그 결괏값을 저장합니다. 10과 20의 합을 더한 결괏값인 30이 k
에 저장되어 출력됩니다.
9.4.2 빼기 연산자: -
이번에는 빼기 연산자를 사용해보겠습니다. 정수와 마찬가지로 산술 연산자는 실수도 동일하게 산술연산을 처리합니다. 실수 데이터를 저장할 수 있는 float
형식은 3.14f
형태처럼 f
를 접미사로 붙여서 초기화 합니다.
코드: operator_subtract.c
//[?] 빼기(-) 연산자
#include <stdio.h>
int main(void)
{
float i = 3.14f;
float j = 3.14f;
float k = i - j; // k = 3.14 - 3.14
printf("%f\n", k); // 0.000000
return 0;
}
0.000000
빼기(-
) 연산자를 사용하면 정수 또는 실수 데이터 타입의 변수를 빼는 기능을 합니다. k = i - j;
코드에 의해서 i
값에서 j
값을 뺀 결괏값이 k
에 담깁니다.
9.4.3 곱하기 연산자: *
이번에는 곱하기 연산자를 사용해보겠습니다.
코드: operator_multiply.c
//[?] 곱하기(*) 연산자
#include <stdio.h>
int main(void)
{
long i = 100;
long j = 200;
long k = i * j; // k = 100 * 200
printf("%ld\n", k); // 20000
return 0;
}
20000
곱하기(*
) 연산자는 키보드의 *
기호를 사용합니다. k = i * j;
코드에 의해서 i
값과 j
값을 곱한 결괏값이 k
에 담깁니다.
9.4.4 나누기 연산자: /
이번에는 나누기 연산자를 사용해보겠습니다.
코드: operator_divide.c
//[?] 나누기(/) 연산자
#include <stdio.h>
int main(void)
{
double i = 1.5;
double j = 0.5;
double k = i / j; // k = 1.5 / 0.5
printf("%lf\n", k); // 3.000000
return 0;
}
3.000000
수학에서 사용하는 나누기 기호는 키보드에 없기 때문에 슬래시(/
) 기호를 사용하여 나누기 기능을 구현합니다. k = i / j;
코드에 의해서 i
값에 j
값을 나눈 결괏값이 k
에 담깁니다.
참고로, 나누기 연산은 0
으로 나눌 수 없습니다.
9.4.5. 나머지 연산자: %
C 언어에서 퍼센트(%
) 기호를 사용하는 나머지 연산자는 나머지 연산의 결과 중 몫이 아닌 나머지를 구해주는 연산자입니다.
참고로, 나머지 연산자는 모듈러스
또는 모듈로
연산자로 발음합니다.
코드: remainder.c
// remainder.c
//[?] 나머지 연산자(Remainder Operator): 몫이 아닌 나머지 값 구하기
#include <stdio.h>
int main(void)
{
int first = 5;
int second = 3;
int result = 0;
result = first % second; // 5 / 3 => 나머지 값인 2를 반환
printf("나머지 값: %d\n", result); // 몫: 1, 나머지: {2}
return 0;
}
나머지 값: 2
이번에는 나머지 연산자를 사용해보겠습니다.
코드: operator_remainder.c
//[?] 나머지(%) 연산자
#include <stdio.h>
int main(void)
{
int i = 5;
int j = 3;
int k = i % j; // k = 5 % 3
printf("%d\n", k); // 2
}
2
k = i % j;
코드에 의해서 i
값에 j
값을 나눈 후 나머지 값이 k
에 담깁니다.
나머지 연산자의 결괏값이 0
인 경우는 나눈 수로 정확히 나누어 떨어진다는 것을 의미하여 짝수 또는 홀수 등 특정 수의 배수를 찾을 때 유용하게 사용할 수 있습니다. 예를 들어 모든 수를 2
로 나누었을 때 나머지가 0
이면 짝수
를 의미하고 나머지가 1
이면 홀수
를 의미하는데 이러한 식을 구현할 때 나머지 연산자(%
)가 사용됩니다.
참고로, 다음과 같은 식으로 나머지 연산자없이 나머지 값을 구할 수도 있습니다.
r = x – (x / y) * y
나머지 연산자에 대한 내용을 한번 더 살펴보겠습니다.
코드: percent_operator.c
// percent_operator.c
#include <stdio.h>
int main(void)
{
int f = 10;
int s = 5;
int r = f % s; // r 변수에는 (f / s) 결과의 나머지 값이 저장
printf("%d %% %d = %d\n", f, s, r);
return 0;
}
10 % 5 = 0
f % s
식에 의해서 10 % 5
가 되는데 몫은 2
이고 나머지는 0
이 됩니다. 이 때 나머지 값인 0
이 r
변수에 담깁니다.
9.4.6 산술 연산자 전체 사용하기
간단하게 2개의 변수를 이용해서 산술 연산을 하는 프로그램을 작성해보겠습니다. 특히 나머지 값을 구해주는 %
연산자를 주의 깊게 살펴보겠습니다.
코드: operator_arithmetic.c
// operator_arithmetic.c
// +, -, *, /, %
#include <stdio.h>
int main(void)
{
int a = 5;
int b = 3;
printf("%d\n", a + b); // 더하기: 8
printf("%d\n", a - b); // 빼기: 2
printf("%d\n", a * b); // 곱하기: 15
printf("%d\n", a / b); // 몫: 1
printf("%d %% %d = %d\n", a, b, (a % b)); // 나머지: 5 % 3 = 2
return 0;
}
8
2
15
1
5 % 3 = 2
일상적인 생활과는 달리 나머지를 구하는 %
연산자는 프로그램 코드에서는 자주 나타나는 연산자입니다.
9.5. 2개의 숫자를 콘솔로부터 입력 받은 후 산술 연산 값 출력하기
2개의 숫자를 콘솔로부터 입력 받은 후 산술 연산을 진행하는 코드를 작성하겠습니다.
코드: scanf_arithmetic.c
// 2개의 숫자를 콘솔로부터 입력받은 후 산술 연산 값 출력하기
#define _CRT_SECURE_NO_WARNINGS // scanf() 보안 경고에 따른 컴파일 에러 방지
#include <stdio.h>
int main(void)
{
int x, y, _;
printf("2개의 정수를 입력하세요: ");
_ = scanf("%d %d", &x, &y);
printf("%d + %d = %d\n", x, y, (x + y));
printf("%d - %d = %d\n", x, y, (x - y));
printf("%d * %d = %d\n", x, y, (x * y));
printf("%d / %d = %d\n", x, y, (x / y));
printf("%d %% %d = %d\n", x, y, (x % y));
return 0;
}
2개의 정수를 입력하세요: 3 5
3 + 5 = 8
3 - 5 = -2
3 * 5 = 15
3 / 5 = 0
3 % 5 = 3
9.6. 장 요약
이번 강의는 단항 연산자인 +
, -
그리고 산술 연산자인 +
, -
, *
, /
, %
연산자에 대해 살펴보았습니다. 계속해서 추가적인 연산자들을 학습해나가겠습니다.