이번 글에선 입출력, 조건문, 반복문을 사용한 간단한 계산기 프로그램을 만들어보도록 하겠습니다.
코드를 보고 따라하기 전에 자신이 먼저 만들어보는 것도 나쁘지 않으니 해보시길 바랍니다.
#include<stdio.h>
int main() {
char op, ex = 'n'; //연산자
int num1, num2; //입력받을 숫자
printf("계산기 프로그램 시작\n");
while (ex == 'n') {
printf("수식을 입력해주세요. : ");
scanf("%d %c %d", &num1, &op, &num2);
getchar();
if (op == '+') {
printf("%d %c %d = %d", num1, op, num2, num1 + num2);
}
else if (op == '-') {
printf("%d %c %d = %d", num1, op, num2, num1 - num2);
}
else if (op == '*') {
printf("%d %c %d = %d", num1, op, num2, num1 * num2);
}
else if (op == '/') {
printf("%d %c %d = %f", num1, op, num2, (float)num1 / num2);
}
else if (op == '%') {
printf("%d %c %d = %d", num1, op, num2, num1 % num2);
}
else {
}
printf("\n");
printf("계산기를 종료하시겠습니까? (y/n) : ");
scanf("%c", &ex);
getchar();
}
printf("계산기를 종료했습니다.");
}
사용자로부터 숫자, 연산자, 숫자순서로 입력받아서 결과를 출력하고
계산기를 종료할지 말지 입력값을 받아 사용자가 y를 입력하면 종료하고 n을 입력하면 계속 진행합니다.
그런데 코드를보시면 나눗셈을 하는 코드에서 (float)이란 걸 보실 수 있습니다.
이것은 형변환을 통해서 num1의 자료형을 float형으로 바꿔서 계산하는 것입니다.
형 변환이란?
그렇다면 이렇게 하는 이유는 무엇이며, 형 변환이라는 것은 대체 무엇이냐?
먼저 형 변환이란 어떤 변수의 자료형을 다른 자료형으로 변경하는 것입니다.
기본적으로 자료형의 크기가 작은 쪽에서 높은 쪽으로 형 변환하는 경우에는 형 확장이라 하고,
반대의 경우에는 형 축소라고 이야기합니다.
형 변환 시 자료형의 상하관계는 다음과 같습니다.
이 형 변환은 다시 암시적 형 변환과 명시적 형 변환으로 나뉘게 되는데요,
암시적 형 변환이란 컴파일러가 알아서 변수의 자료형을 적절하게 다른 자료형으로 바꾸어주는 것입니다.
이를 자동 형 변환이라고도 말합니다.
또한 명시적 형 변환이란 사용자가 명시적으로 바꿀 자료형을 지정하여 바꾸는 것을 이야기합니다.
간단한 예로 int형 변수 a를 선언하고 double형 변수 b에 a의 값을 대입하면
a의 값이 double형으로 형 변환되어 변수 b에 들어가게 됩니다. 이것이 암시적 형변환힙니다.
데이터의 손실에 주의하자
여기서 주의해야 할 점은 형 확장의 경우에는 암시적 형 변환이 가능하지만
형 축소의 경우에는 사용자가 자료형을 정해주는 명시적 형 변환을 해주어야 합니다.
그 이유는 형 축소시에는 데이터의 손실이 일어날 수 있기 때문인데요,
간단하게 물통으로 예를 들어보겠습니다.
큰 물통과 작은 물통이 있을 때, 큰 물통에 있는 물을 작은 물통으로 옮겨 담을 때
그 물이 작은 물통의 허용량을 넘으면 물이 넘치게 될 것입니다. 이것이 바로 데이터 손실입니다.
따라서 프로그래머는 이 물을 옮겨 담아도 문제가 없다고 컴파일러에게 명시적으로 알려주어야 합니다.
명시적 형 변환의 기본적인 사용법은 (자료형)변수 또는 (자료형)값 의 형태로 사용할 수 있습니다.
예를 들어 정수 15를 (float)15의 형태로 형 변환하면 값은 15.0이 됩니다.
그러면 이제 위의 코드로 돌아가서 나눗셈에서 왜 형 변환을 사용하였는지 설명해보겠습니다.
본래 C언어에서 나눗셈을 수행해서 결과를 실수로 표현하기 위해선 피연산자가 실수여야만 합니다.
그런데 형 변환을 하지 않으면 정수끼리 나눗셈을 하기 때문에 값이 제대로 구해지지 않습니다.
이는 컴퓨터에서 정수를 저장하는 방법과 실수를 저장하는 방법이 전혀 다르기 때문입니다.
따라서 명시적 형 변환을 통해 num1을 float형으로 바꾸어줌으로써 피연산자를 실수로 변경한 것입니다.
굳이 둘 다 바꿀 필요 없이 하나만 실수형으로 바꾸어주면 나눗셈 계산이 정상적으로 가능합니다.
위와 같은 계산식에서 복수의 변수중 하나만 실수형으로 바꾸게 되면,
나머지 변수들은 컴파일러가 알아서 암시적 형 변환을 해주기 때문입니다.
하지만 나눗셈의 결과를 정수로 표현하고 싶을 때(몫만 사용할 때)에는 굳이 형변환을 안 하셔도 됩니다.
이 정도로 계산기 구현과 형 변환에 대한 설명은 마치도록 하겠습니다.
계산기에 기능을 추가해서 코딩을 해보시는 것도 좋을 것 같으니 해보시기 바랍니다.
다음 글에선 사용자 정의 함수에 대해서 알아보도록 하겠습니다.
감사합니다.
'프로그래밍 언어 > C언어' 카테고리의 다른 글
C언어 10. 배열 (0) | 2020.07.13 |
---|---|
C언어 9. 사용자 정의 함수 (0) | 2020.07.12 |
C언어 7. 반복문 (0) | 2020.07.11 |
C언어 6. 조건문 (0) | 2020.07.11 |
C언어 5. 입출력 (0) | 2020.07.10 |