([C언어] 24강) "자동적 형변환"과 "명시적 형변환"
안녕하세요! 잭클입니다!
이번 시간에는 자동적 형변환과 명시적 형변환에 대해서 배울건데요
(약간 늦은 감이 있네요 뒤죽박죽 순서 죄송합니다..ㅠㅠ)
자 우선 어렵지 않으니 바로 코드부터 보시죠!
#include <stdio.h>
int main()
{
char c = 'A';
int number = c;
printf("%d",number);
}
자 이 코드의 실행 결과는 무엇일까요?
에러가 난다고요?
그럴 것 같지만 아닙니다. 한번 실행해보죠
65가 출력되네요! 왜죠??
바로 "자동적 형변환" 때문입니다!
c에는 char형의 'A'값이 들어있습니다
int형인 number에 c를 넣으려 하니
자동으로 char형 값이 int형으로 형변환되어
'A'의 아스키코드 값인 65가 number변수로 할당되게 됩니다!
이처럼 자동적으로 형변환되는 경우를 "자동적 형변환"이라고 부릅니다
그럼 아래 코드의 실행결과는 무엇일까요?
#include <stdio.h>
int main()
{
float a = 2.548;
int num = a;
printf("%d",num);
}
이 코드의 num에는 2가 들어가게 됩니다. 이유는 float에서 int로 자동적으로 형변환이
이루어 지기 때문인데요! 소수형에서 정수형으로 바뀔 때에는 소수점을 싹 다 버리고
정수 값만 남게 되니 참고해주세요!
자 그럼 아래 코드도 보시죠!
#include <stdio.h>
int main()
{
float a = 2.548;
printf("%d",a);
}
이 코드의 실행 결과는 뭘까요?
printf함수를 통해 float값을 출력하려면 포맷이 "% f"여야 합니다!
하지만 지금은 %d네요? 과연 오류일까요?
아니요, 이때도 자동적 형변환이 이루어져 2가 출력되게 됩니다!
자동적 형변환! 이해하셨나요?
그럼 이번에는 명시적 형변환을 배워볼까요?
명시적 형변환이란 자동적으로 형변환 되지 않는 경우를
"나 이거 형변환 시킬거야" 라고 명시적으로 선언해주는 것을 말하는데요!
아래 코드를 보시죠
#include <stdio.h>
int main()
{
int a = 5;
int b = 2;
float c = a / b;
printf("%f",c);
}
위 코드의 실행 결과는 뭘까요?
5 / 2한 값을 float형 변수 c에 할당하니까 2.5겠네요!
땡땡땡!!!!
2.00입니다!! 왤까요?
같은 자료형끼리의 계산에는 자동적으로 형변환이 이루어지지 않습니다!
5/2는 정수 / 정수 이기 때문에 정수끼리의 계산이므로 결과 또한 형변환이 이루어지지 않고
정수를 반환합니다. 즉 5 / 2에서 정수 2가 반환되었고
그 결과를 float형 변수 c에다 할당하니 int에서 float로 자동적 형변환이 일어나서
2.00이 나오는 것이죠!
그럼 이때 어떻게 해야 2.5가 나오게 할 수 있을까요??
방금 말했다시피 같은 자료형끼리의 계산에는 형변환이 이루어지지 않는다고 했습니다!
그럼 한쪽 또는 양쪽의 자료형을 원하는 자료형으로 바꿔주면 되겠네요!
하지만.. 어떻게..?
이때 필요한 게 명시적 형변환입니다
아래 코드를 보시죠
#include <stdio.h>
int main()
{
int a = 5;
int b = 2;
float c = (float)a / b;
printf("%f",c);
}
엥 a앞에 (float)이 들어갔네요! 이건 무슨 의미일까요?
(float)a의 의미는 a의 자료형을 먼저 float로 명시적으로 형변환을 하겠다!라는 말입니다.
저렇게 해주면 5 / 2가 아니라 a가 소수로 명시적으로 형변환되므로
5.00 / 2가 되겠네요! 그럼 결과를 한번 볼까요??
원하는 결과를 얻었네요!
자 그럼 저번 시간에 배웠던 malloc앞에 (int *)를 붙였던 것 기억나시나요?
그것에 대한 해석을 들려드릴 수 있을 것 같군요!
우선 malloc의 반환 값의 자료형부터 봅시다!
비주얼 스튜디오에 malloc을 치시면
이 모습을 보실 수 있을 겁니다
눈치채셨나요? malloc은 void *형 값을 반환합니다.
메모리의 주소만 반환하면 되는 것이니 말이죠!
그럼 우리가 이것을 사용하기 위해선
우리가 원하는 자료형의 포인터로 형변환을 해주어야 합니다.
그렇기 때문에 int *형으로 형변환을 해야하는 상황이라면
(int *)malloc(size);
char *형으로 형변환을 해야 하는 상황이라면
(char *)malloc(size);
이런 식으로 명시적 형변환을 해주는 겁니다!
쉽게 오늘 내용을 요약하자면
형변환이란 자료형이 다른 자료형으로 바뀌는 것이고
자동적 형변환은 프로그래머가 따로 지정해주지 않아도 자동으로 형변환이 일어나는 것이고
명시적 형변환은 자동적 형변환이 일어나지 않을 때 프로그래머가 필요에 따라 직접 형변환을 시키는 것
이라고 볼 수 있겠네요!
오늘 강좌는 여기까지구요!
수고하셨습니다!