본문 바로가기
c언어

c언어 형 변환(캐스팅)하기

by 개발자 L 2022. 12. 2.
반응형

c언어 형 변환(캐스팅)하기

네 안녕하세요, 이번 포스팅에서는 c언어로 형 변환(캐스팅)을 하는 방법에 대하여 알아보도록 하겠습니다.

형 변환은 다른 말로 캐스팅이라고 하는데, 사실 프로그래밍 언어의 꽃이라고 봐도 됩니다.

(그리고 캐스팅이라는 말을 더 많이 씁니다.)

그 이유는 우리가 코드를 작성을 하다 보면 처음에 선언한 자료형을 나중에 출력을 할 때 다른 형태로 받아야 할 때가 생기기 때문입니다.

특히 정수형을 실수형으로 바꾸거나, 반대로 실수형을 정수형으로 바꾸는 경우, 한 개의 결과를 출력하는 것을 여러 개의 결과(문자열)를 출력하는 경우 등 다양합니다.

그중에서 특히 c언어에서는 그러한 형 변환을 정말 자주 씁니다.

특히, 정수와 실수의 형변환을 가장 많이 씁니다.

그래서 이 형변환을 어떻게 쓰는 것인지 한 번 알아보겠습니다.

 

1. 형 변환의 종류

형 변환은 크게 두 가지의 종류로 나뉩니다.

자동적으로 변환이 되느냐, 아니면 개발자가 명시적으로 데이터의 형태를 변환하느냐에 따라서 이렇게 나뉩니다.

  • 자동적인 형 변환
  • 명시적인 형 변환

그래서 이 순서대로 한 번 알아보도록 하겠습니다.

 

2. 자동적인 형 변환

자동적인 형 변환은 컴파일러에 의해서 자동적으로 형변환이 되어 저장이 되어 수행이 됩니다.

그리고 이는 또 3가지의 경우에 따라서 형변환이 이루어집니다.

  • 대입 연산 시 형변환
  • 정수 연산 시 형변환
  • 수식 연산 시 형변환

 

2 - 1. 대입 연산 시 자동적인 형변환

자동 형변환은 대입 연산을 할 때 일어날 수 있습니다.

대입 연산자의 오른쪽에 있는 값은 왼쪽에 선언이 되어있는 변수의 자료형으로 자동으로 저장이 됩니다.

그리고 선언이 된 자료형의 형태에 따라 더 높은 등급의 자료형으로 변환이 되는 '올림 변환'이 일어날 수 있고,

반대로 더 낮은 등급으로 변환이 되는 '내림 반환'이 일어날 수 있습니다.

먼저 '올림 반환이 일어난 경우입니다.

double f;
f = 10;

이 경우를 한 번 봅시다.

f라는 변수의 자료형을 double로 선언을 했습니다.

일단 기본적으로 정수형 보다 더 높은 등급의 자료형이 바로 실수형 자료형입니다.

그 이유는 정수가 실수의 범위 안에 들어있기 때문이지요

그래서 f에 정수인 수를 입력을 한다면,

컴파일러에서는 위에서 선언한 double형의 자료형에 따라서 더 상위 트림인 10.0인 실수의 형태로 저장을 합니다.

반대로 내림 변환이 일어나는 경우도 한 번 보겠습니다.

int i;
i = 3.141592;

이 경우를 한 번 보도록 하겠습니다.

이럴 때는 위에서 선언이 된 자료형이 정수형이기 때문에

밑에서 i의 값을 실수로 입력을 해도 위에서 자료형을 정수로 쓰겠다 선언을 했기 때문에 소수부는 다 잘리고 정수부인 3만이 저장이 됩니다.

그리고 이러한 내림 변환은 실수형과 정수형뿐만 아니라, 문자형도 정수형의 일부이기 때문에 변환이 됩니다.

그래서 실수형 > 정수형 > 문자형 순으로 변환이 일어나며, 이는 바이트 수가 크고 작은 순으로 변환이 됩니다.

그리고 보통 내림 변환은 잘 쓰지 않습니다.

그 이유는 보통 내림 변환을 쓰는 프로그램이 실제로 많이 없기 때문입니다.

그리고 컴파일러에서도 내림 변환이 일어났다고 경고 메시지를 보냅니다.

그래서 이럴 경우는 명시적인 형 변환을 하여 해결을 하곤 합니다.

그럼 이와 관련된 간단한 예제 코드를 한 번 작성을 해보도록 하겠습니다.

#include <stdio.h>

int main()

{
    char c;
    int i;
    float f;

    c = 10000;
    i = 1.23456 + 10;
    f = 10 + 20;

    printf("c = %d, i = %d, f = %f\n", c, i, f);

    return 0;
}

이렇게 한 번 적어봤습니다.

이럴 경우에는 c에 입력된 숫자가 int -> char형이 되어 내림 변환이 되고,

i에 입력된 수는 int로 선언이 되었기 때문에 float -> int로 내림 변환이 되며,

f에 입력된 수는 float으로 선언이 되었기 때문에 int -> float으로 올림 변환이 됩니다.

그럼 결과 화면은 어떻게 나오는지 한 번 보도록 하겠습니다.

tempCodeRunnerFile.c: In function 'main':
tempCodeRunnerFile.c:10:9: warning: overflow in implicit constant conversion [-Woverflow]
     c = 10000;
         ^~~~~
c = 16, i = 11, f = 30.000000

이렇게 뜹니다.

실제로 내림 변환이 될 때 표현 범위를 넘어서서 오버 플로우가 발생을 할 수도 있습니다.

그래서 이러한 경고 메시지가 뜹니다.

하지만 이는 내림 변환이 일어나는 부분에서 일어나는 매우 지극히 정상적인 현상입니다.

이래서 보통 내림 변환을 쓰지 않는다는 것입니다.

반응형

 

2 - 2. 정수 연산 시 자동적인 형 변환

그리고 앞서 말씀을 드렸듯이, 정수형 끼리도 형 변환이 가능하다 말씀을 드렸습니다.

일단 정수형의 연산은 당연히 결괏값은 int로 받습니다.

하지만 정수형의 종류는 이렇게 있습니다.

  • char
  • short
  • int

이 중에서 제일 상위 등급은 int입니다.

int가 이들 중에서 바이트 수가 가장 크기 때문입니다.

그래서 char형이나 short형이 수식으로 등장을 하게 되면 컴파일러가 자동으로 int형으로 승격을 시켜서 연산을 합니다.

그래서 그 결과값은 int밖에 나올 수가 없습니다.

 

2 - 3. 수식 연산 시 자동적인 형 변환

원칙적으로는 수식을 연산을 할 때는 같은 자료형끼리 계산을 합니다.

그러나 간혹 서로 다른 자료형이 한 수식 안에서 일어나는 경우가 있습니다.

예를 들자면 int형과 float형이 한 번에 연산이 되는 경우이죠.

그래서 이럴 경우 컴파일러는 서로 다른 두 개의 자료형으로 선언된 변수 중 더 높은 등급의 자료형으로 변환을 자동으로 시킵니다.

그래서 보통 주로 쓰는 자료형을 기준으로 하여 낮은 등급부터 높은 등급 순으로 나열을 해본다면

char -> int -> unsigned int -> long -> unsignedlong -> float -> double -> long double 순으로 나열이 됩니다.

그리고 제가 하나의 예시를 한 번 들어보겠습니다.

10 + 1.2345

이런 수식이 있다고 한다면, 1.2345가 실수형이라 더 등급이 높기 때문에 정수형인 10이 10.0.으로 변환이 자동으로 되어 계산이 됩니다.

 

3. 명시적인 형 변환

명시적인 형 변환은 개발자가 자체적으로 정의를 하여 형변환을 수동으로 하는 방식입니다.

그리고 이러한 방법을 '캐스팅'이라고 하며, 제일 많이 씁니다.

그리고 이러한 형변환 연산자를 그냥 영어 그대로 캐스트 연산자라고도 부릅니다.

그리고 개발자들은 영어로 된 용어를 자주 쓰기 때문에 형변환 대신 캐스팅이라는 말을 더 자주 쓴다고 제가 말씀을 드린 겁니다.

예를 든다면 이런 식입니다.

f = (double)i; // 변수의 값을 형변환 하고 싶은 경우
f = (double)(x + y); // 수식의 값을 형변환 하고 싶은 경우

보통은 형 변환을 할 때 정수끼리의 연산보다는 정수와 실수의 연산을 하므로.

저런 식으로 float과 double을 c언어에서는 많이 씁니다.

그럼 간단한 예제와 함께 같이 보시죠.

#include <stdio.h>

int main()

{
    int i;
    double f;

    f = 5 / 4;
    printf("%f\n", f);

    f = (double)5 / 4;
    printf("%f\n", f);

    f = 5.0 / 4;
    printf("%f\n", f);

    f = (double)5 / (double)4;
    printf("%f\n", f);

    i = 1.3 + 1.8;
    printf("%d\n", i);

    i = (int)1.3 + (int)1.8;
    printf("%d\n", i);

    return 0;
}

이렇게 한 번 작성을 해봤습니다.

이렇게 하게 되면 내림 연산을 해도 주의 메시지를 컴파일러가 보내지 않습니다.

그래서 오버 플로우가 날 일도 없습니다.

그럼 결과를 한 번 보도록 하겠습니다.

1.000000
1.250000
1.250000
1.250000
3
2

이렇게 결과도 잘 나왔음을 볼 수가 있습니다.

이제 여러분들은 캐스팅을 자유자재로 쓸 수 있게 되었습니다.

 

여기까지 c언어 형 변환(캐스팅)에 대하여 알아보았습니다.

다음 포스팅에서는 c언어 연산자의 우선순위와 결합 규칙에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다 ~

반응형

댓글