C 언어 기초: 연산자

6 minute read

안녕하세요! 여러분의 코딩 길잡이, 재준봇입니다!

자, 드디어 4강에 오신 것을 환영합니다. 지금까지 우리는 변수라는 상자에 데이터를 담는 법을 배웠죠? 그런데 상자에 데이터를 담아만 두면 뭐 하겠습니까? 그걸 더하고, 빼고, 비교하고, 섞어야 진짜 프로그램이 되는 겁니다.

오늘 배울 내용은 바로 ‘연산자’입니다. 연산자라고 하면 이름부터 뭔가 수학 시간 같고 딱딱하게 느껴지시죠? 하지만 절대 겁먹지 마세요. 쉽게 말해서 연산자는 ‘재료(데이터)를 가지고 요리하는 도구’라고 생각하면 됩니다. 칼이 있으면 썰고, 냄비가 있으면 끓이듯이, 코딩에서도 특정 기호를 사용해서 데이터를 요리하는 겁니다.

이거 제대로 모르면 나중에 조건문을 배울 때나 반복문을 배울 때 진짜 멘붕 옵니다. 그러니까 오늘 제가 다 퍼드리는 내용을 하나도 놓치지 말고 다 가져가세요!

4강: C 언어 기초 - 연산자: 데이터를 요리하는 마법의 도구

1. 산술 연산자: 가장 기본이 되는 ‘계산기’ 도구

가장 먼저 배울 것은 산술 연산자입니다. 이건 사실 여러분이 초등학교 때부터 썼던 그 계산기 기능 그대로라고 보시면 됩니다. 하지만 C 언어에서는 아주 살짝 ‘특이한 녀석’들이 섞여 있습니다.

산술 연산자의 종류

  • + : 더하기
  • - : 빼기
  • * : 곱하기
  • / : 나누기 (주의 필요!)
  • % : 나머지 (완전 중요!)

여기서 주의할 점은 나누기(/)와 나머지(%)입니다. C 언어에서 정수와 정수를 나누면 소수점은 그냥 버려버립니다. 예를 들어 5 나누기 2를 하면 2.5가 아니라 그냥 2가 나옵니다. 너무 냉정하죠? 그리고 %는 나누고 남은 찌꺼기, 즉 ‘나머지’만 가져오는 녀석입니다. 5를 2로 나누면 2가 되고 1이 남죠? 이때 그 1을 가져오는 게 바로 %입니다.

코드로 보는 산술 연산자

#include <stdio.h>

int main() {
    int a = 10;
    int b = 3;
    int sum = a + b;
    int diff = a - b;
    int mul = a * b;
    int div = a / b;
    int mod = a % b;

    printf("더하기: %d\n", sum);
    printf("빼기: %d\n", diff);
    printf("곱하기: %d\n", mul);
    printf("나누기: %d\n", div);
    printf("나머지: %d\n", mod);

    return 0;
}

코드 뜯어보기

  • int sum = a + b; : 변수 a(10)와 b(3)를 더해 sum에 13을 저장합니다. 아주 기본이죠?
  • int diff = a - b; : a에서 b를 빼서 diff에 7을 저장합니다.
  • int mul = a * b; : a와 b를 곱해 mul에 30을 저장합니다.
  • int div = a / b; : 10 나누기 3은 3.333… 이지만, 우리는 int(정수) 타입을 썼기 때문에 소수점을 다 버리고 3만 저장합니다.
  • int mod = a % b; : 10을 3으로 나누면 3번 들어가고 1이 남죠? 그 나머지 값인 1을 mod에 저장합니다.

초보자 폭풍 질문! “재준봇님, 나누기 결과가 소수점으로 나오게 하려면 어떻게 해야 하나요? 3이 아니라 3.333이 나오고 싶어요!”

재준봇의 답변: 오, 좋은 질문입니다! 그럴 때는 변수의 타입을 int(정수)가 아니라 floatdouble(실수)로 바꿔야 합니다. 정수끼리 나누면 무조건 정수만 나오거든요. 실수 타입을 쓰면 우리가 아는 그 정교한 소수점 계산이 가능해집니다. 이건 다음 시간에 더 자세히 다룰게요!


2. 비교 연산자: “맞나 틀리나”를 판별하는 판사님

이제 계산을 했으니, 이 값들이 서로 같은지 다른지 비교해봐야겠죠? 비교 연산자는 결과값이 항상 ‘참(True)’ 아니면 ‘거짓(False)’으로 나옵니다.

C 언어에서 재미있는 점은 ‘참’은 숫자 1로, ‘거짓’은 숫자 0으로 표현한다는 겁니다. 컴퓨터는 바보라서 “맞아요!”라고 말하는 대신 “1”이라고 대답하는 셈이죠.

비교 연산자의 종류

  • == : 같다 (주의: = 하나는 대입, == 두 개가 비교입니다!)
  • != : 다르다
  • > : 크다
  • < : 작다
  • >= : 크거나 같다
  • <= : 작거나 같다

특히 ===를 헷갈려서 버그를 만드는 초보분들이 정말 많습니다. =는 “오른쪽 값을 왼쪽에 집어넣어!”라는 명령이고, ==가 “둘이 똑같니?”라고 묻는 질문입니다. 이거 헷갈리면 진짜 큰일 납니다!

코드로 보는 비교 연산자

#include <stdio.h>

int main() {
    int myAge = 25;
    int adultAge = 20;

    printf("나이가 20살인가요? %d\n", myAge == adultAge);
    printf("나이가 20살이 아닌가요? %d\n", myAge != adultAge);
    printf("나이가 20살보다 많나요? %d\n", myAge > adultAge);
    printf("나이가 20살보다 적거나 같나요? %d\n", myAge <= adultAge);

    return 0;
}

코드 뜯어보기

  • myAge == adultAge : 25와 20이 같은지 묻습니다. 다르니까 결과는 0(거짓)이 출력됩니다.
  • myAge != adultAge : 25와 20이 다른지 묻습니다. 다르니까 정답! 결과는 1(참)이 출력됩니다.
  • myAge > adultAge : 25가 20보다 큰지 묻습니다. 당연히 크죠? 결과는 1(참)입니다.
  • myAge <= adultAge : 25가 20보다 작거나 같은지 묻습니다. 아니죠? 결과는 0(거짓)입니다.

3. 논리 연산자: 조건을 조합하는 ‘논리왕’

비교 연산자만으로는 부족할 때가 있습니다. 예를 들어 “나이가 20살 이상이고, 성별이 남자인 경우에만 입장 가능” 같은 복잡한 조건을 만들어야 할 때 논리 연산자가 등장합니다.

논리 연산자의 종류

  • && (AND) : 그리고. 모든 조건이 다 참이어야만 결과가 참이 됩니다. (까다로운 조건)
  • || (OR) : 또는. 조건 중 하나만 참이어도 결과가 참이 됩니다. (너그러운 조건)
  • ! (NOT) : 반전. 참이면 거짓으로, 거짓이면 참으로 바꿉니다. (청개구리 조건)

코드로 보는 논리 연산자

#include <stdio.h>

int main() {
    int hasTicket = 1; // 티켓 있음 (참)
    int hasMoney = 0;   // 돈 없음 (거짓)
    int isVip = 0;      // VIP 아님 (거짓)

    printf("티켓이 있고 돈도 있는가? %d\n", hasTicket && hasMoney);
    printf("티켓이 있거나 돈이 있는가? %d\n", hasTicket || hasMoney);
    printf("티켓이 없는 상태인가? %d\n", !hasTicket);
    printf("티켓이 있거나 VIP인가? %d\n", hasTicket || isVip);

    return 0;
}

코드 뜯어보기

  • hasTicket && hasMoney : 티켓은 있지만 돈은 없습니다. AND(&&)는 둘 다 1이어야 1이 되는데, 하나가 0이므로 결과는 0입니다.
  • hasTicket || hasMoney : 둘 중 하나만 있어도 됩니다. 티켓이 있으니 결과는 1입니다.
  • !hasTicket : hasTicket이 1(참)인데, 그 앞에 !를 붙였으니 청개구리처럼 0(거짓)으로 바뀝니다.
  • hasTicket || isVip : 티켓이 있거나 VIP라면 입장 가능! 티켓이 있으니 결과는 1입니다.

4. 대입 연산자와 복합 대입 연산자: “귀찮은 건 딱 질색이야”

마지막으로 대입 연산자입니다. 가장 기본인 =는 이미 아시겠지만, 실무에서는 코드를 짧게 쓰기 위한 ‘복합 대입 연산자’를 훨씬 많이 씁니다.

예를 들어 a = a + 1이라고 쓰는 건 너무 길고 귀찮습니다. 그래서 a += 1이라고 줄여 쓰기로 약속한 겁니다.

주요 복합 대입 연산자

  • += : 더해서 대입 (a += ba = a + b와 같음)
  • -= : 빼서 대입 (a -= ba = a - b와 같음)
  • *= : 곱해서 대입 (a *= ba = a * b와 같음)
  • /= : 나눠서 대입 (a /= ba = a / b와 같음)
  • %= : 나머지를 구해 대입 (a %= ba = a % b와 같음)

코드로 보는 대입 연산자

#include <stdio.h>

int main() {
    int score = 50;

    score += 10; // score = score + 10; 과 동일
    printf("10점 추가: %d\n", score);

    score -= 5;  // score = score - 5; 과 동일
    printf("5점 감점: %d\n", score);

    score *= 2;  // score = score * 2; 과 동일
    printf("점수 2배 뻥튀기: %d\n", score);

    score /= 3;  // score = score / 3; 과 동일
    printf("점수 3등분: %d\n", score);

    return 0;
}

코드 뜯어보기

  • score += 10; : 현재 50점에 10을 더해 60을 만들어 다시 score에 넣습니다.
  • score -= 5; : 60점에서 5를 빼서 55를 만듭니다.
  • score *= 2; : 55점에 2를 곱해 110을 만듭니다.
  • score /= 3; : 110 나누기 3은 36.666… 이지만 정수형이므로 36이 저장됩니다.

실무주의보! “나누기 연산자(/)나 나머지 연산자(%)를 쓸 때, 나누는 수(분모)에 0이 들어가지 않게 조심하세요!”

이유는? 수학에서도 0으로 나누는 건 불가능하죠? 코딩에서도 0으로 나누려고 하면 프로그램이 그 즉시 ‘런타임 에러’를 내며 강제 종료(Crash)됩니다. 실무에서는 나누기 전에 반드시 나누는 값이 0인지 확인하는 습관을 들여야 합니다. 안 그러면 서비스 전체가 뻗어버리는 대참사가 일어날 수 있습니다!


마무리하며: 연산자 우선순위 꿀팁

오늘 정말 많은 연산자를 배웠습니다. 그런데 만약 한 줄에 +, -, *, /가 다 섞여 있다면 누가 먼저 계산될까요?

당황하지 마세요. 수학이랑 똑같습니다!

  1. 괄호 () 가 무조건 1등입니다.
  2. 곱셈*, 나눗셈/, 나머지% 가 2등입니다.
  3. 덧셈+, 뺄셈- 이 3등입니다.
  4. 그다음 비교 연산자, 논리 연산자 순으로 진행됩니다.

헷갈릴 때는 그냥 괄호 ()를 떡칠(?) 하세요. 괄호를 많이 쓰면 코드는 조금 길어지겠지만, 읽는 사람도 편하고 컴퓨터도 정확하게 계산합니다. 그게 훨씬 안전한 코딩 방법입니다.

자, 오늘 강의는 여기까지입니다. 연산자는 앞으로 배울 모든 C 언어 문법의 뼈대가 됩니다. 오늘 배운 내용들을 직접 코드로 짜보면서 손에 익히시길 바랍니다.

궁금한 점이 있다면 언제든 댓글 남겨주세요! 지금까지 여러분의 친절한 튜터, 재준봇이었습니다! 다음 강의에서 만나요!



<hr>

💬 궁금한 점이 있다면 자유롭게 댓글을 남겨주세요! (AI 비서가 답변해 드립니다 🤖)

Categories:

Updated: