C 언어 타입 캐스팅과 상수(Const) 심화 이해

C 언어의 데이터 형변환 (Type Casting)

프로그램을 작성하다 보면 특정 데이터 타입을 다른 타입으로 변환해야 하는 상황이 발생합니다. 이를 형변환(Type Casting)이라고 하며, 크게 컴파일러가 자동으로 처리하는 방식과 개발자가 직접 지정하는 방식으로 나뉩니다.

암시적 형변환 (Implicit Casting)

서로 다른 데이터 타입 간에 할당이 이루어질 때, 컴파일러가 자동으로 안전한 방향으로 타입을 변환합니다. 보통 메모리 크기가 작은 타입에서 큰 타입으로 변환될 때 발생합니다.

#include <stdio.h>

int main() {
    // 정수형에서 실수형으로 자동 변환
    int base_value = 42;
    double converted_value = base_value;

    printf("자동 변환 결과: %f\n", converted_value); // 42.000000 출력
    return 0;
}

하지만 반대의 경우, 즉 실수형에서 정수형으로 자동 변환이 일어나면 소수점 이하 데이터가 잘려나가며 정보 손실이 발생할 수 있으므로 주의해야 합니다.

#include <stdio.h>

int main() {
    // 실수형에서 정수형으로 자동 변환 시 소수점 손실
    double precise_val = 89.999;
    int truncated_val = precise_val;

    printf("손실된 결과: %d\n", truncated_val); // 89 출력
    return 0;
}

정수 나눗셈의 함정

정수끼리 나눗셈을 수행하면 결과도 정수로 저장되어 소수점 부분이 버려집니다. 결과 변수를 실수형으로 선언하더라도, 연산 자체가 정수로 수행되기 때문에 예상과 다른 결과가 나옵니다.

#include <stdio.h>

int main() {
    int a = 7;
    int b = 3;
    double result = a / b; 

    printf("나눗셈 결과: %f\n", result); // 2.000000 출력 (2.333333이 아님)
    return 0;
}

명시적 형변환 (Explicit Casting)

데이터 손실을 방지하거나 정수 나눗셈의 함정을 피하기 위해 개발자가 직접 타입을 지정해 변환할 수 있습니다. 변환하려는 타입을 소괄호 ()로 감싸 값이나 변수 앞에 붙여 사용합니다.

#include <stdio.h>

int main() {
    int numerator = 7;
    int denominator = 3;
    
    // 분자를 실수형으로 강제 변환하여 정확한 나눗셈 수행
    double exact_result = (double)numerator / denominator;

    printf("정확한 나눗셈 결과: %.2f\n", exact_result); // 2.33 출력
    return 0;
}

위 코드처럼 피연산자 중 하나라도 실수형으로 캐스팅되면, 전체 연산이 실수형 기준으로 수행되어 올바른 결과를 얻을 수 있습니다. 또한 %.2f와 같은 포맷 지정자를 활용하면 소수점 자릿수를 깔끔하게 제어할 수 있습니다.

변경 불가능한 데이터: 상수 (Constants)

프로그램 실행 중에 값이 변해서는 안 되는 데이터(예: 수학 공식의 파이, 물리 상수 등)를 다룰 때는 const 키워드를 사용하여 상수로 선언합니다. 이는 실수로 인한 데이터 변조를 컴파일 단계에서 방지해 줍니다.

#include <stdio.h>

int main() {
    const double GRAVITY = 9.81;
    const int MAX_RETRY_COUNT = 5;

    // GRAVITY = 10.0; // 컴파일 오류: 상수 값은 변경할 수 없음
    
    printf("중력 가속도: %.2f\n", GRAVITY);
    return 0;
}

상수 선언 시 주의사항

const로 선언된 변수는 메모리에 할당되는 시점에 초기화되어야 하며, 이후에 값을 대입하는 것은 문법적으로 허용되지 않습니다.

#include <stdio.h>

int main() {
    // 올바른 선언 및 초기화
    const float SPEED_OF_LIGHT = 299792458.0f;
    
    // 잘못된 사용 예시
    // const int BUFFER_SIZE;
    // BUFFER_SIZE = 1024; // 오류: 초기화되지 않은 상수 및 추후 할당 불가

    return 0;
}

상수를 적절히 활용하면 매직 넘버(Magic Number)를 제거하여 코드의 가독성을 높이고, 유지보수 과정에서 발생할 수 있는 논리적 오류를 원천적으로 차단할 수 있습니다.

태그: C C언어 TypeCasting const 자료형변환

7월 3일 01:21에 게시됨