[C 시리즈 4편] 연산자와 형 변환으로 값 계산하고 비교하기

English version

3편에서 변수와 자료형으로 값을 저장했다면, 이제는 그 값을 계산하고 비교하는 법을 익혀야 합니다. C에서는 같은 숫자 계산이라도 자료형에 따라 결과가 달라질 수 있고, 정수끼리 나누는지 실수까지 포함하는지에 따라 해석도 달라집니다. 이번 글에서는 연산자와 형 변환을 함께 보며, "왜 이 계산 결과가 이렇게 나왔는가"를 설명할 수 있는 감각을 만드는 데 집중합니다.

이번 글에서 새로 나오는 용어

  1. (Expression): 값으로 계산될 수 있는 코드 조각 (a + b, score >= 80 등)
  2. 산술 연산자 (Arithmetic Operator): 덧셈, 뺄셈, 곱셈, 나눗셈처럼 계산에 쓰는 연산자
  3. 비교 연산자 (Comparison Operator): 두 값을 비교해 참/거짓을 판단하는 연산자
  4. 형 변환 (Type Conversion): 한 자료형의 값을 다른 자료형처럼 바꾸어 해석하는 과정
  5. 캐스팅 (Casting): (double)count처럼 개발자가 형 변환을 직접 지정하는 방법

핵심 개념

학습 메모

  • 소요 시간: 45~60분
  • 준비물: 변수 선언, printf, sizeof를 사용해 본 경험
  • 학습 목표: 연산자 우선순위와 형 변환이 결과에 미치는 영향을 이해하기

연산자는 값을 계산하거나 비교하는 도구이고, 형 변환은 그 계산을 어떤 자료형 규칙으로 수행할지 정하는 장치입니다. 둘을 따로 떼어 보기보다 함께 이해해야 실제 코드 결과를 정확히 읽을 수 있습니다.

이번 글에서는 아래 다섯 가지를 중심으로 봅니다.

  • +, -, *, /, %로 기본 계산하기
  • 비교 연산자로 값을 비교해 참과 거짓 만들기
  • 정수 나눗셈과 실수 나눗셈의 차이 이해하기
  • 자동 형 변환과 명시적 캐스팅 구분하기
  • 복합 대입과 증감 연산자로 값을 짧게 갱신하기

코드로 따라하기

산술 연산자로 계산하기

가장 먼저 익힐 것은 기본 계산 연산자입니다.

#include <stdio.h>

int main(void) {
    int a = 12;
    int b = 5;

    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;
}

/는 나눗셈, %는 나머지를 구하는 연산자입니다. 특히 a / b는 둘 다 int이므로 정수 나눗셈이 되어 소수점 아래를 버립니다. 그래서 12 / 52가 됩니다.

비교 연산자로 조건 만들기

비교 연산자는 다음 편의 조건문으로 바로 이어지는 핵심 도구입니다.

#include <stdio.h>

int main(void) {
    int score = 85;

    printf("score >= 80 -> %d\n", score >= 80);
    printf("score == 100 -> %d\n", score == 100);
    printf("score != 60 -> %d\n", score != 60);
    return 0;
}

여기서 결과는 1 또는 0으로 출력됩니다. printf%d를 썼기 때문에 비교 결과도 정수처럼 보이는 것입니다. C에서는 비교 결과를 이런 정수값으로 다루는 경우가 많습니다. 보통 1은 참, 0은 거짓처럼 읽으면 됩니다.

정수 나눗셈과 실수 나눗셈

처음 배울 때 가장 많이 헷갈리는 부분이 바로 이 차이입니다.

#include <stdio.h>

int main(void) {
    int total = 7;
    int count = 2;

    printf("int division = %d\n", total / count);
    printf("float division = %.2f\n", (double)total / count);
    return 0;
}

첫 번째 줄은 7 / 2를 정수 나눗셈으로 계산하므로 3이 됩니다. 두 번째 줄은 totaldouble로 바꾼 뒤 계산하므로 3.50처럼 실수 결과가 나옵니다.

처음에는 아래 한 줄만 함께 기억해도 도움이 됩니다.

7 / 2 -> 3, 7.0 / 2 -> 3.5

즉, 계산식 안에 실수형이 하나라도 끼어들면 결과가 더 정밀한 실수 쪽으로 올라가는 경우가 많습니다. 다만 실제 형 변환 규칙은 자료형 조합마다 조금씩 다를 수 있으므로, 나중에 signedunsigned가 섞이는 경우처럼 더 복잡한 상황은 따로 주의해야 합니다.

자동 형 변환과 명시적 캐스팅

형 변환에는 컴파일러가 자동으로 하는 경우와, 개발자가 직접 지정하는 경우가 있습니다.

#include <stdio.h>

int main(void) {
    int count = 3;
    double price = 2.5;
    double total = count * price;
    double average = (double)7 / 2;

    printf("total = %.1f\n", total);
    printf("average = %.2f\n", average);
    return 0;
}

count * price에서는 count가 자동으로 더 넓은 자료형 쪽에 맞춰 해석됩니다. 반면 (double)7 / 2는 개발자가 7을 직접 double로 바꾸라고 지정한 예시입니다.

입문 단계에서는 아래처럼 기억하면 충분합니다.

  • 자동 형 변환: 계산 중 더 넓은 자료형에 맞춰 자연스럽게 바뀜
  • 명시적 캐스팅: 개발자가 (double)처럼 직접 바꾸라고 지시함

복합 대입과 증감 연산자

값을 조금씩 바꿀 때는 더 짧은 표기를 쓸 수 있습니다.

#include <stdio.h>

int main(void) {
    int level = 1;

    level = level + 2;
    printf("level = %d\n", level);

    level += 3;
    printf("level = %d\n", level);

    level++;
    printf("level = %d\n", level);
    return 0;
}

level += 3level = level + 3과 같은 뜻이고, level++는 1을 더하는 짧은 표기입니다. 이런 표현은 다음 편 반복문에서 매우 자주 보게 됩니다. 이번 단계에서는 level++를 "값을 1 증가시키는 표기" 정도로만 이해하면 충분합니다.

초보자 단계에서는 value++ + ++value처럼 한 줄에서 증감 연산자를 여러 번 섞는 코드는 피하는 것이 좋습니다. 먼저 변수 값이 어떻게 바뀌는지 단순한 예제로 익히는 편이 안전합니다.

실전 예시: 평균 점수 계산하기

#include <stdio.h>

int main(void) {
    int math = 80;
    int english = 91;
    int science = 87;
    int total = math + english + science;
    double average = (double)total / 3;

    printf("total = %d\n", total);
    printf("average = %.2f\n", average);
    printf("average >= 85 -> %d\n", average >= 85.0);
    return 0;
}

이 예제에는 덧셈, 나눗셈, 캐스팅, 비교 연산이 함께 들어 있습니다. 실제 코드는 이렇게 여러 연산이 섞여 나오는 경우가 많으므로, 한 줄씩 끊어 읽는 습관이 중요합니다.

왜 중요한가

연산자와 형 변환을 이해해야 조건문, 반복문, 함수 인자 계산이 모두 쉬워집니다. 계산 결과가 왜 바뀌는지 모르고 넘어가면, 다음 글에서 조건이 왜 참이 되고 거짓이 되는지도 흐릿해집니다.

이번 글에서 꼭 남겨야 할 핵심은 다섯 가지입니다.

  • 산술 연산자는 값을 계산하고, 비교 연산자는 조건 판단 재료를 만든다.
  • 정수끼리 나누면 소수점 아래가 버려질 수 있다.
  • 실수형이 섞이거나 캐스팅을 하면 결과 해석이 달라질 수 있다.
  • +=, ++ 같은 짧은 표기는 반복과 상태 갱신에서 자주 쓴다.
  • 식을 읽을 때는 "어떤 자료형으로 계산되는가"를 함께 봐야 한다.

CodeSandbox로 이어서 실습하기

아래 샌드박스는 CodeSandbox의 Universal starter입니다. C는 터미널에서 직접 컴파일하고 다시 실행하는 흐름이 중요하니, 이번 글의 코드를 파일로 만들고 빌드-실행 사이클을 다시 따라가 보세요.

Live Practice

C Practice Sandbox

CodeSandbox

Run the starter project in CodeSandbox, compare it with the lesson code, and keep experimenting.

Universal starterCterminal
  1. starter를 fork한 뒤 hello.c 같은 실습 파일을 만든다
  2. 본문 코드를 붙여 넣고 clang 또는 gcc가 있으면 직접 컴파일한다
  3. 코드를 고친 뒤 다시 빌드하고 실행 결과를 비교한다

C는 브라우저 미리보기보다 터미널 빌드 흐름이 핵심입니다. Universal starter의 컴파일러 구성이 환경에 따라 다를 수 있으니, 먼저 clang이나 gcc 사용 가능 여부부터 확인하세요.

실습

  • 따라 하기: 본문 예제를 실행하고 정수 나눗셈과 실수 나눗셈 결과를 비교합니다.
  • 확장하기: int x = 17, int y = 4로 값을 바꿔 +, -, *, /, % 결과를 모두 출력해 봅니다.
  • 디버깅: (double) 캐스팅을 지운 뒤 평균 계산 결과가 왜 달라지는지 설명해 봅니다.
  • 완료 기준: 산술 연산자, 비교 연산자, 자동 형 변환, 캐스팅을 각각 한 문장으로 설명하고, 계산 결과를 스스로 예측할 수 있으면 됩니다.

마무리

이번 글에서는 값을 계산하고 비교하는 연산자, 그리고 그 계산을 어떤 자료형 규칙으로 해석할지 결정하는 형 변환을 살펴봤습니다. 중요한 것은 기호를 외우는 것보다, "이 식이 어떤 자료형으로 계산되고 어떤 값이 만들어지는가"를 읽는 습관입니다. 다음 글에서는 이렇게 만든 비교 결과를 이용해 프로그램 흐름을 갈라 주는 조건문과 반복문을 살펴보겠습니다.

💬 댓글

이 글에 대한 의견을 남겨주세요