Skip to content

4주차 · 입·출력 함수와 연산자(2)

지난 시간에는 printf()로 값을 출력하고 scanf()로 값을 입력받는 방법을 배웠습니다.

이번 시간에는 값을 계산하고, 비교하고, 조건을 판단할 때 사용하는 기호를 배웁니다.

이 기호들을 연산자(operator)라고 합니다.

오늘의 목표

오늘 수업이 끝났을 때 아래 내용을 설명할 수 있으면 충분합니다.

  1. +, -, *, /, %로 기본 계산을 할 수 있다.
  2. =, ==가 서로 다른 뜻이라는 것을 안다.
  3. >, <, >=, <=, ==, !=로 값을 비교할 수 있다.
  4. &&, ||, !로 여러 조건을 연결할 수 있다.
  5. +=, -=, ++, --의 뜻을 안다.
  6. 조건 ? 값1 : 값2 형태의 조건 연산자를 읽을 수 있다.
  7. 비트 연산자가 0과 1을 직접 다루는 연산이라는 것을 안다.

1. 연산자란 무엇인가요?

먼저 아주 익숙한 계산을 봅시다.

text
3 + 2 = 5

여기에서 32는 계산에 사용되는 값이고, +는 두 값을 더하라는 기호입니다.

C언어에서도 같은 방식으로 계산합니다.

c
int result = 3 + 2;

여기에서 +가 바로 연산자입니다.

연산자 = 값을 계산하거나 비교하거나 바꾸기 위해 사용하는 기호

연산자가 작동하는 대상은 피연산자(operand)라고 부릅니다.

text
3 + 2
↑   ↑
피연산자

+는 연산자이고, 32는 피연산자입니다.

용어가 어려워도 괜찮습니다

시험이나 교재에서는 연산자, 피연산자라는 말을 사용합니다.

하지만 처음에는 "연산자는 계산 기호, 피연산자는 그 기호가 사용하는 값"이라고 이해하면 충분합니다.


2. 오늘 만날 연산자의 종류

이번 시간에는 다음 여섯 가지를 중심으로 공부합니다.

종류대표 기호하는 일
산술 연산자+ - * / %숫자를 계산합니다.
관계 연산자> < >= <= == !=두 값을 비교합니다.
논리 연산자&& || !여러 조건을 연결하거나 뒤집습니다.
대입 연산자= += -= *= /= %=변수에 값을 넣거나 계산 후 다시 넣습니다.
조건 연산자? :조건에 따라 둘 중 하나를 선택합니다.
비트 연산자& | ^ ~ << >>숫자를 2진수의 0과 1 단위로 계산합니다.

처음부터 모든 기호를 외우지 않아도 됩니다.

직접 실행하면서 하나씩 익숙해지는 것이 더 중요합니다.


3. 산술 연산자 · 숫자 계산하기

산술 연산자는 우리가 수학 시간에 사용하던 계산 기호와 거의 비슷합니다.

연산자결과
+더하기7 + 310
-빼기7 - 34
*곱하기7 * 321
/나누기7 / 3자료형에 따라 달라짐
%나머지7 % 31

첫 번째 계산 실습

아래 코드를 복사해서 실행해 봅시다.

c
#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 3;

    printf("a + b = %d\n", a + b);
    printf("a - b = %d\n", a - b);
    printf("a * b = %d\n", a * b);
    printf("a / b = %d\n", a / b);
    printf("a %% b = %d\n", a % b);

    return 0;
}

실행 결과:

text
a + b = 13
a - b = 7
a * b = 30
a / b = 3
a % b = 1

printf() 안에서 %를 문자 그대로 출력할 때

printf()에서 %는 서식 지정자를 시작하는 특별한 문자입니다.

그래서 화면에 % 자체를 보여 주고 싶다면 %%라고 적습니다.

c
printf("10 %% 3 = %d\n", 10 % 3);

4. 정수끼리 나누면 소수점이 사라집니다

초보자가 매우 자주 놀라는 부분입니다.

c
int result = 7 / 2;

사람이 계산하면 3.5라고 생각합니다.

하지만 72가 모두 정수이므로 C언어에서는 정수 나눗셈이 됩니다.

결과는 다음과 같습니다.

text
3

소수점 아래 부분은 버려집니다.

정수 ÷ 정수 → 정수 결과

7 / 23

소수점까지 얻고 싶다면?

둘 중 하나 이상을 실수로 만들어 주면 됩니다.

c
#include <stdio.h>

int main(void)
{
    printf("7 / 2 = %d\n", 7 / 2);
    printf("7.0 / 2 = %.1f\n", 7.0 / 2);

    return 0;
}

실행 결과:

text
7 / 2 = 3
7.0 / 2 = 3.5

시험에서도 자주 나오는 부분

5 / 2의 결과를 2.5라고 생각하기 쉽습니다.

두 값이 모두 정수라면 결과는 2입니다.


5. %는 퍼센트가 아니라 나머지 연산자입니다

C 코드에서 두 숫자 사이에 있는 %나머지를 구하는 연산자입니다.

c
7 % 3

7개를 3개씩 묶는다고 생각해 봅시다.

text
● ● ●   ● ● ●   ●
└ 3개 ┘  └ 3개 ┘  남은 1개

따라서

text
7 / 3 → 몫은 2
7 % 3 → 나머지는 1

짝수인지 홀수인지 확인할 때

어떤 정수를 2로 나누었을 때 나머지가 0이면 짝수입니다.

c
number % 2

예:

text
8 % 2 → 0
9 % 2 → 1

아직 if문은 다음 주에 배우지만, 나머지 연산자가 어디에 쓰이는지 눈에 익혀 두세요.


6. 증가 연산자와 감소 연산자

변수의 값을 1 증가시키거나 1 감소시키는 일이 매우 자주 있습니다.

다음 코드는 count에 1을 더합니다.

c
count = count + 1;

C언어에서는 더 짧게 쓸 수 있습니다.

c
count++;

1을 빼고 싶다면:

c
count--;
연산자
++값을 1 증가
--값을 1 감소

직접 실행해 보기

c
#include <stdio.h>

int main(void)
{
    int count = 5;

    printf("처음: %d\n", count);

    count++;
    printf("1 증가: %d\n", count);

    count--;
    printf("1 감소: %d\n", count);

    return 0;
}

실행 결과:

text
처음: 5
1 증가: 6
1 감소: 5

++countcount++는 무엇이 다른가요?

둘 다 결국 count를 1 증가시킵니다.

하지만 다른 식 안에서 사용할 때 증가하는 시점이 다릅니다.

c
++count;   // 전위 증가
count++;   // 후위 증가

처음에는 복잡하게 사용할 필요가 없습니다.

초보자에게 추천하는 방법

당분간 count++;처럼 한 줄에서 증가만 시키는 형태로 사용하세요.

그러면 전위와 후위의 차이 때문에 혼란스러울 일이 거의 없습니다.


7. 대입 연산자 = · 값을 상자에 넣기

2주차에서 이미 매우 중요한 내용을 배웠습니다.

c
age = 25;

C언어에서 =는 수학의 "같다"가 아닙니다.

오른쪽 값을 왼쪽 변수에 넣는다는 뜻입니다.

age25

즉,

c
age = 25;

는 다음처럼 읽는 것이 좋습니다.

"25를 age에 넣는다."


8. 복합 대입 연산자 · 계산하고 다시 넣기

다음 코드를 봅시다.

c
score = score + 10;

score의 현재 값에 10을 더한 뒤 다시 score에 넣습니다.

C언어에서는 다음처럼 줄여 쓸 수 있습니다.

c
score += 10;

두 문장은 같은 의미입니다.

c
score = score + 10;
score += 10;

대표적인 복합 대입 연산자는 다음과 같습니다.

긴 형태짧은 형태의미
a = a + 3a += 33을 더해 다시 저장
a = a - 3a -= 33을 빼서 다시 저장
a = a * 3a *= 33을 곱해 다시 저장
a = a / 3a /= 33으로 나눠 다시 저장
a = a % 3a %= 33으로 나눈 나머지를 저장

실습

c
#include <stdio.h>

int main(void)
{
    int money = 1000;

    money += 500;
    printf("500원을 더하면: %d\n", money);

    money -= 200;
    printf("200원을 쓰면: %d\n", money);

    return 0;
}

실행 결과:

text
500원을 더하면: 1500원
200원을 쓰면: 1300원

9. 관계 연산자 · 두 값을 비교하기

관계 연산자는 두 값을 비교합니다.

예를 들어

text
나이 20세 이상인가?
점수가 60점 이상인가?
두 숫자가 같은가?

같은 질문에 사용합니다.

연산자읽는 방법
>크다a > b
<작다a < b
>=크거나 같다a >= b
<=작거나 같다a <= b
==같다a == b
!=같지 않다a != b

비교 결과는 어떻게 나오나요?

C언어에서는 조건이 거짓이면 0, 참이면 0이 아닌 값으로 다룹니다.

관계 연산의 결과는 보통 다음처럼 확인할 수 있습니다.

c
#include <stdio.h>

int main(void)
{
    printf("10 > 5  : %d\n", 10 > 5);
    printf("10 < 5  : %d\n", 10 < 5);
    printf("10 == 10: %d\n", 10 == 10);
    printf("10 != 10: %d\n", 10 != 10);

    return 0;
}

일반적인 실행 결과:

text
10 > 5  : 1
10 < 5  : 0
10 == 10: 1
10 != 10: 0
0 → 거짓(false)

0이 아닌 값 → 참(true)

관계 연산의 결과

>, <, == 같은 관계 연산자는 C에서 조건이 참이면 1, 거짓이면 0이라는 정수 결과를 만듭니다.

앞으로 if문에서 이 결과를 많이 사용하게 됩니다.


10. 가장 중요한 실수 · ===는 다릅니다

이 부분은 여러 번 확인해도 좋습니다.

= 하나

c
age = 20;

뜻:

"20을 age에 넣는다."

== 두 개

c
age == 20

뜻:

"age가 20과 같은가?"

=대입오른쪽 값을 왼쪽 변수에 넣기
==비교두 값이 같은지 확인하기

반드시 구별하세요

===는 서로 완전히 다른 연산자입니다.

c
score = 100;    // 100을 score에 넣는다
score == 100    // score가 100인지 비교한다

나중에 if문을 배울 때 가장 자주 하는 실수 중 하나입니다.


11. 논리 연산자 · 여러 조건을 연결하기

현실에서는 조건이 하나만 있는 경우보다 여러 조건이 함께 있는 경우가 많습니다.

예를 들어 영화관 할인 조건이 다음과 같다고 해 봅시다.

"나이가 65세 이상이고 회원이어야 할인"

여기에는 두 조건이 있습니다.

text
나이가 65세 이상
그리고
회원이다

이런 조건을 연결할 때 논리 연산자를 사용합니다.

연산자이름쉬운 뜻
&&논리 AND그리고
||논리 OR또는
!논리 NOT아니다 / 반대로

12. && · 두 조건이 모두 참이어야 합니다

&&그리고라고 생각하면 쉽습니다.

c
age >= 65 && member == 1

뜻:

"나이가 65세 이상이고, 회원 상태도 1인가?"

두 조건이 모두 참일 때만 전체 결과가 참입니다.

조건 A조건 BA && B
거짓거짓거짓
거짓거짓
거짓거짓

직접 실행해 보기

c
#include <stdio.h>

int main(void)
{
    int age = 70;
    int member = 1;

    printf("조건 결과: %d\n", age >= 65 && member == 1);

    return 0;
}

실행 결과:

text
조건 결과: 1

13. || · 둘 중 하나만 참이어도 됩니다

||또는이라고 생각하면 됩니다.

키보드에서 |는 보통 역슬래시 \와 같은 키에 있습니다.

c
age < 8 || age >= 65

뜻:

"8세 미만이거나 또는 65세 이상인가?"

둘 중 하나만 참이어도 전체 결과가 참입니다.

조건 A조건 BA || B
거짓거짓거짓
거짓
거짓

14. ! · 참과 거짓을 뒤집습니다

!는 조건의 결과를 반대로 바꿉니다.

c
!0

0은 거짓이므로 반대로 하면 참입니다.

text
!0 → 1

반대로

c
!1

은 거짓이 됩니다.

text
!1 → 0

예를 들어

c
member != 1

처럼 !=에서도 느낌표가 등장합니다.

!=는 두 글자를 한 연산자로 보고 "같지 않다"라고 읽습니다.


15. &, &&, &age는 서로 다릅니다

3주차에서 다음 코드를 봤습니다.

c
scanf("%d", &age);

그리고 이번 주에는 &&와 비트 연산자 &가 등장합니다.

모양이 비슷해서 혼동하기 쉽습니다.

표현어디에서 봤나요?현재 단계에서 이해할 뜻
&agescanf()age 변수의 위치를 알려 줌
a & b비트 연산두 숫자의 비트를 AND 연산
조건A && 조건B논리 연산두 조건이 모두 참인지 확인
&age → 변수 위치

& → 비트 AND

&& → 논리 AND

정확한 &age의 원리는 9~10주차의 포인터에서 다시 자세히 배웁니다.


16. 조건 연산자 ? : · 둘 중 하나 고르기

조건에 따라 두 값 중 하나를 선택할 수 있습니다.

형태는 다음과 같습니다.

c
조건 ? 참일_때_값 : 거짓일_때_값

처음 보면 낯설지만 질문처럼 읽으면 됩니다.

c
age >= 20 ? 100 : 50

이것을 말로 읽으면:

"age가 20 이상인가? 맞으면 100, 아니면 50"

예제

c
#include <stdio.h>

int main(void)
{
    int age = 25;
    int price;

    price = age >= 20 ? 10000 : 5000;

    printf("요금은 %d원입니다.\n", price);

    return 0;
}

실행 결과:

text
요금은 10000원입니다.
age >= 20 ?조건을 확인
참이면 10000`?` 뒤의 값
:
거짓이면 5000`:` 뒤의 값

지금은 읽을 수 있으면 충분합니다

조건 연산자를 복잡하게 여러 번 겹쳐 쓰면 읽기 어려워집니다.

초보 단계에서는 간단한 둘 중 하나 선택에만 사용해 봅시다.


17. 비트 연산자를 배우기 전에 · 2진수 다시 보기

컴퓨터 내부에서는 숫자를 0과 1로 표현합니다.

예를 들어 십진수 5는 2진수로 다음과 같이 표현할 수 있습니다.

text
십진수 5 → 0101
십진수 3 → 0011

비트 연산자는 이 0과 1을 자리별로 직접 계산합니다.

50101
30011

비트(bit)란?

컴퓨터가 사용하는 가장 작은 정보 단위 중 하나로, 0 또는 1 한 자리를 비트라고 생각하면 됩니다.


18. 비트 AND &

비트 AND는 같은 자리의 두 비트가 둘 다 1일 때만 1이 됩니다.

text
5  → 0101
3  → 0011
-----------
&     0001  → 1

따라서

c
5 & 3

의 결과는 1입니다.

직접 확인하기

c
#include <stdio.h>

int main(void)
{
    printf("5 & 3 = %d\n", 5 & 3);
    return 0;
}

실행 결과:

text
5 & 3 = 1

19. 비트 OR |와 XOR ^

비트 OR |

둘 중 하나라도 1이면 1입니다.

text
5  → 0101
3  → 0011
-----------
|     0111  → 7
c
5 | 3

결과는 7입니다.

비트 XOR ^

두 비트가 서로 다를 때 1입니다.

text
5  → 0101
3  → 0011
-----------
^     0110  → 6
c
5 ^ 3

결과는 6입니다.

ABA & BA | BA ^ B
00000
01011
10011
11110

논리 연산자와 구별하세요

논리 연산자:

c
&&
||

비트 연산자:

c
&
|

기호 개수가 다릅니다.


20. 비트 NOT ~

~는 각 비트를 반대로 뒤집습니다.

text
0 → 1
1 → 0

예를 들어 단순히 4자리만 놓고 보면:

text
0101
↓ 모두 뒤집기
1010

하지만 실제 C의 정수는 보통 여러 비트로 저장되고, 음수 표현 방식도 함께 적용됩니다.

그래서 ~5의 실제 십진수 결과를 처음 보고 예상과 다르다고 느낄 수 있습니다.

~ 결과는 지금 숫자까지 외우지 않아도 됩니다

이번 시간에는 "각 비트를 0↔1로 뒤집는 연산자"라는 원리만 이해하면 충분합니다.

정수의 실제 비트 수와 음수 표현까지 함께 알아야 결과를 정확히 이해할 수 있습니다.


21. 비트 이동 연산자 <<, >>

비트를 왼쪽이나 오른쪽으로 이동시키는 연산자도 있습니다.

왼쪽 이동 <<

c
5 << 1

5를 2진수로 보면:

text
0000 0101   (5)
        ↓ 왼쪽으로 1칸
0000 1010   (10)

양수 범위에서 단순한 경우에는 왼쪽으로 1칸 이동할 때 2배가 되는 것처럼 볼 수 있습니다.

오른쪽 이동 >>

c
10 >> 1
text
0000 1010   (10)
        ↓ 오른쪽으로 1칸
0000 0101   (5)

단순한 양수에서는 오른쪽으로 1칸 이동할 때 2로 나눈 것처럼 볼 수 있습니다.

무조건 ×2, ÷2라고 외우지는 마세요

부호가 있는 정수, 범위를 벗어나는 이동 등에서는 주의할 점이 있습니다.

이번 초급 과정에서는 "비트 자리를 왼쪽 또는 오른쪽으로 옮긴다"는 개념을 먼저 익힙니다.


22. 연산자 우선순위 · 무엇을 먼저 계산할까요?

수학에서 다음 계산을 보면

text
2 + 3 × 4

곱하기를 먼저 계산합니다.

text
2 + 12 = 14

C언어에도 연산자 우선순위가 있습니다.

c
2 + 3 * 4

결과는 14입니다.

괄호를 사용하면 더 분명합니다

c
(2 + 3) * 4

결과는 20입니다.

초보 단계에서 모든 우선순위를 암기할 필요는 없습니다.

헷갈리면 괄호 `( )`를 사용하세요.

사람이 읽기 쉬워지고 실수도 줄어듭니다.

자주 만나는 순서는 대략 다음 정도만 눈에 익혀 둡니다.

text
( )

* / %

+ -

비교 연산자

&&

||

대입 =

정확한 우선순위는 더 많습니다

C에는 더 많은 연산자가 있고 자세한 우선순위 규칙도 있습니다.

지금은 복잡한 식을 억지로 암산하지 말고 괄호로 의도를 분명히 표현하는 습관을 들이는 것이 좋습니다.


23. 실습 · 두 숫자를 입력받아 계산하기

지금까지 배운 입력과 산술 연산을 함께 사용해 봅시다.

c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int a;
    int b;

    printf("첫 번째 정수를 입력하세요: ");
    scanf("%d", &a);

    printf("두 번째 정수를 입력하세요: ");
    scanf("%d", &b);

    printf("\n--- 계산 결과 ---\n");
    printf("더하기: %d\n", a + b);
    printf("빼기: %d\n", a - b);
    printf("곱하기: %d\n", a * b);
    printf("정수 나누기: %d\n", a / b);
    printf("나머지: %d\n", a % b);

    return 0;
}

두 번째 숫자는 0이 아닌 값을 입력하세요

아직 조건 제어문을 배우기 전이므로 이 실습에서는 두 번째 숫자에 0을 입력하지 않습니다.

0으로 나누는 연산은 정상적인 계산이 아니며 다음 주 if문을 배우면 이런 상황을 코드로 막는 방법을 배웁니다.

예를 들어 10, 3을 입력하면:

text
첫 번째 정수를 입력하세요: 10
두 번째 정수를 입력하세요: 3

--- 계산 결과 ---
더하기: 13
빼기: 7
곱하기: 30
정수 나누기: 3
나머지: 1

24. 실습 · 비교 결과 확인하기

c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int a;
    int b;

    printf("두 정수를 공백으로 구분해 입력하세요: ");
    scanf("%d %d", &a, &b);

    printf("a > b  : %d\n", a > b);
    printf("a < b  : %d\n", a < b);
    printf("a == b : %d\n", a == b);
    printf("a != b : %d\n", a != b);

    return 0;
}

10 5를 입력하면 어떤 결과가 나오는지 직접 확인해 봅니다.

그리고 5 10, 10 10으로도 바꾸어 실행해 보세요.


25. 일부러 틀려 보고 고쳐 봅시다

문제 1 · 같은지 비교하려고 했는데?

c
int score = 100;
printf("%d\n", score = 90);

이 코드는 score가 90인지 비교하는 코드일까요?

정답 보기

아닙니다. =는 대입 연산자입니다.

90score에 넣습니다.

같은지 비교하려면 ==를 사용합니다.

c
printf("%d\n", score == 90);

문제 2 · 5 나누기 2가 왜 2인가요?

c
printf("%d\n", 5 / 2);
정답 보기

52가 모두 정수이므로 정수 나눗셈입니다.

결과는 2입니다.

소수점 결과가 필요하다면 예를 들어 다음처럼 할 수 있습니다.

c
printf("%.1f\n", 5.0 / 2);

결과:

text
2.5

문제 3 · 논리 AND는 어느 것인가요?

text
A. &
B. &&
C. |
D. ||
정답 보기

B의 &&입니다.

  • && → 논리 AND
  • & → 비트 AND 또는 문맥에 따라 주소 관련 연산

문제 4 · 다음 결과는?

c
7 % 3
정답 보기

1입니다.

7을 3으로 나누면 몫은 2이고 나머지는 1입니다.


26. 오늘 배운 내용 확인하기

1번

10 / 4의 결과는 무엇일까요? 두 숫자는 모두 정수입니다.

정답 보기

2입니다. 정수끼리 나누면 소수점 아래 부분이 버려집니다.

2번

10 % 4의 결과는 무엇일까요?

정답 보기

2입니다.

3번

두 값이 같은지 비교하는 연산자는 무엇인가요?

  • A. =
  • B. ==
정답 보기

B의 ==입니다.

=는 값을 넣는 대입 연산자입니다.

4번

"A도 참이고 B도 참"을 표현하는 논리 연산자는 무엇인가요?

정답 보기

&&입니다.

5번

"A 또는 B 중 하나만 참이어도 된다"를 표현하는 연산자는 무엇인가요?

정답 보기

||입니다.

6번

다음 코드에서 score의 값은 얼마가 될까요?

c
int score = 50;
score += 20;
정답 보기

70입니다.

score += 20score = score + 20과 같은 의미입니다.

7번

다음 식의 결과는 무엇일까요?

c
2 + 3 * 4
정답 보기

14입니다.

곱하기가 더하기보다 먼저 계산됩니다.

8번

비트 연산자 &와 논리 연산자 &&는 같은 연산자인가요?

정답 보기

아닙니다.

  • &는 두 숫자의 비트를 AND하는 데 사용할 수 있습니다.
  • &&는 두 조건이 모두 참인지 확인하는 논리 AND입니다.

27. 이번 주 핵심 요약

모든 연산자를 한 번에 외우려고 하지 않아도 됩니다.

아래 내용부터 확실히 기억합시다.

① + - * / % → 기본 계산을 합니다.

② 정수 / 정수 → 결과도 정수입니다.

③ % → 나머지를 구합니다.

④ = → 값을 넣습니다.

⑤ == → 두 값이 같은지 비교합니다.

⑥ 관계 연산 결과 → 참 또는 거짓을 나타냅니다.

⑦ && / || / ! → 조건을 연결하거나 뒤집습니다.

⑧ ? : → 조건에 따라 둘 중 하나를 선택합니다.

⑨ & | ^ ~ << >> → 비트 단위로 계산합니다.

⑩ 우선순위가 헷갈리면 → 괄호를 사용합니다.

다음 시간 예고

다음 시간에는 프로그램이 상황에 따라 다른 길을 선택하거나 같은 일을 반복하도록 만드는 방법을 배웁니다.

  • if, if ~ else
  • switch
  • for
  • while
  • do ~ while
  • break, continue

지금까지 배운 관계 연산자와 논리 연산자가 다음 시간부터 본격적으로 사용됩니다.