Topic 4: 자료형 변환 🔄
학습 목표
- 자료형 변환의 개념과 필요성을 이해할 수 있다
- 암시적 변환과 명시적 변환의 차이점을 구분할 수 있다
- 적절한 형변환을 사용하여 정확한 결과를 얻을 수 있다
자료형 변환이 필요한 이유
프로그래밍에서는 서로 다른 자료형 간의 연산이나 대입이 자주 발생합니다. 이때 자료형을 변환해야 올바른 결과를 얻을 수 있습니다.
#include <iostream>
using namespace std;
int main() {
// 문제 상황: 정수 나눗셈
int a = 7, b = 2;
cout << "정수 나눗셈: " << a << " / " << b << " = " << (a / b) << endl; // 3 (소수점 버림)
// 해결: 실수로 변환하여 나눗셈
cout << "실수 나눗셈: " << a << " / " << b << " = " << ((double)a / b) << endl; // 3.5
return 0;
}
암시적 변환 (Implicit Conversion)
컴파일러가 자동으로 수행하는 형변환입니다.
승격 변환 (Promotion)
작은 자료형이 큰 자료형으로 자동 변환됩니다.
#include <iostream>
using namespace std;
int main() {
// 정수 승격
char ch = 'A'; // ASCII: 65
short s = 100;
int i = 200;
long l = 300L;
// char → int → long 순으로 승격
long result = ch + s + i + l;
cout << "char + short + int + long = " << result << endl;
// 실수 승격
float f = 3.14f;
double d = 2.718;
// float → double로 승격
double floatResult = f + d;
cout << "float + double = " << floatResult << endl;
return 0;
}
자동 변환 규칙
#include <iostream>
using namespace std;
int main() {
// 정수와 실수 연산
int intNum = 10;
double doubleNum = 3.5;
// int가 double로 변환됨
double result1 = intNum + doubleNum;
cout << "int + double = " << result1 << endl;
// 대입에서의 자동 변환
int i = 3.7; // double → int (소수점 버림)
double d = 42; // int → double (42.0)
cout << "int i = 3.7의 결과: " << i << endl; // 3
cout << "double d = 42의 결과: " << d << endl; // 42.0
// bool 변환
bool b1 = 42; // 0이 아니면 true
bool b2 = 0; // 0이면 false
cout << boolalpha;
cout << "bool b1 = 42: " << b1 << endl; // true
cout << "bool b2 = 0: " << b2 << endl; // false
return 0;
}
명시적 변환 (Explicit Conversion)
프로그래머가 직접 지정하는 형변환입니다.
C 스타일 캐스팅
#include <iostream>
using namespace std;
int main() {
// 기본 형변환
double pi = 3.14159;
int intPi = (int)pi; // double → int
cout << "원주율을 int로: " << intPi << endl; // 3
// 정수 나눗셈을 실수 나눗셈으로
int a = 7, b = 3;
double result = (double)a / b; // 하나만 변환해도 됨
cout << a << " / " << b << " = " << result << endl;
// 문자와 숫자 변환
char letter = 'A';
int ascii = (int)letter;
cout << "'" << letter << "'의 ASCII 코드: " << ascii << endl;
char fromAscii = (char)65;
cout << "ASCII 65의 문자: " << fromAscii << endl;
return 0;
}
형변환의 다양한 활용
#include <iostream>
using namespace std;
int main() {
// 실수 계산을 위한 형변환
int totalPrice = 12345;
int itemCount = 7;
// 정확한 평균 가격 계산
double avgPrice = (double)totalPrice / itemCount;
cout << "평균 가격: " << avgPrice << "원" << endl;
// 비율 계산
int passed = 43, total = 50;
double passRate = (double)passed / total * 100;
cout << "합격률: " << passRate << "%" << endl;
return 0;
}
형변환 시 주의사항
데이터 손실 가능성
#include <iostream>
using namespace std;
int main() {
// 큰 자료형 → 작은 자료형 (데이터 손실 위험)
double largeNum = 3.14159265359;
float smallNum = (float)largeNum;
cout << "double: " << largeNum << endl;
cout << "float: " << smallNum << endl;
// 범위 초과
int bigInt = 300;
char smallChar = (char)bigInt; // char 범위: -128~127 또는 0~255
cout << "int " << bigInt << " → char " << (int)smallChar << endl;
// 음수 → 부호 없는 타입
int negative = -5;
unsigned int positive = (unsigned int)negative;
cout << "negative int: " << negative << endl;
cout << "unsigned int: " << positive << endl; // 매우 큰 양수가 됨
return 0;
}
올바른 형변환 사용법
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// 정확한 평균 계산
int kor = 88, eng = 92, math = 85;
// 잘못된 방법
double wrongAvg = (kor + eng + math) / 3; // 정수 나눗셈 후 변환
// 올바른 방법
double correctAvg = (double)(kor + eng + math) / 3; // 실수 나눗셈
cout << fixed << setprecision(2);
cout << "잘못된 평균: " << wrongAvg << endl; // 88.00
cout << "올바른 평균: " << correctAvg << endl; // 88.33
// 반올림 처리
double score = 87.6;
int rounded = (int)(score + 0.5); // 반올림
cout << "점수 " << score << "의 반올림: " << rounded << endl;
return 0;
}
형변환 활용 예제
온도 변환 프로그램
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double celsius, fahrenheit, kelvin;
cout << "섭씨 온도를 입력하세요: ";
cin >> celsius;
// 형변환을 통한 정확한 계산
fahrenheit = celsius * 9.0 / 5.0 + 32.0;
kelvin = celsius + 273.15;
cout << fixed << setprecision(2);
cout << "섭씨: " << celsius << "°C" << endl;
cout << "화씨: " << fahrenheit << "°F" << endl;
cout << "켈빈: " << kelvin << "K" << endl;
return 0;
}
시간 계산 프로그램
#include <iostream>
using namespace std;
int main() {
int totalSeconds;
cout << "총 초 단위 시간을 입력하세요: ";
cin >> totalSeconds;
// 형변환을 통한 시간 단위 분할
int hours = totalSeconds / 3600; // 시간
int minutes = (totalSeconds % 3600) / 60; // 분
int seconds = totalSeconds % 60; // 초
cout << totalSeconds << "초는 ";
cout << hours << "시간 " << minutes << "분 " << seconds << "초입니다." << endl;
// 백분율 계산 예제
int correct = 18, total = 20;
double percentage = (double)correct / total * 100;
cout << "\n정답률: " << correct << "/" << total << " = ";
cout << fixed << setprecision(1) << percentage << "%" << endl;
return 0;
}
실습 과제
기초 실습
- 두 정수를 입력받아 정확한 평균(소수점 2자리)을 계산하는 프로그램을 작성해보세요.
- ASCII 코드 값을 입력받아 해당하는 문자를 출력하고, 문자를 입력받아 ASCII 코드를 출력하는 프로그램을 작성해보세요.
심화 실습
- 세 과목의 점수를 입력받아 평균을 계산하고, 소수점 첫째 자리까지 출력하는 프로그램을 작성해보세요.
- 분 단위 시간을 입력받아 “시간과 분” 형태로 변환하여 출력하는 프로그램을 작성해보세요.
핵심 포인트
- 암시적 변환: 컴파일러가 자동으로 수행 (작은 타입 → 큰 타입이 안전)
- 명시적 변환: 프로그래머가 직접 지정 (위험할 수 있으므로 주의 필요)
- C 스타일:
(type)value
- 간단하지만 위험할 수 있음 - 형변환 활용: 정확한 계산을 위해 필수적
- 주의사항: 큰 타입 → 작은 타입 변환 시 데이터 손실 가능
- 활용: 정확한 나눗셈, 평균 계산, 단위 변환 등에 필수
이제 기본 자료형과 연산자를 마스터했으니, 다음 단원에서는 이들을 활용한 조건문을 배워보겠습니다.
✅ 자료형 변환 체크리스트
Last updated on