
타입 변환이라고도 하며, 하나의 데이터 타입을 다른 타입으로 바꾸는 것을 의미한다.
메모리에 할당 받은 바이트의 크기가 작은 타입에서 큰 타입으로의 형 변환은 생략할 수 있지만, 그 반대로의 형 변환은 데이터의 손실이 발생한다.
프로그램에서 값의 대입이나 연산을 수행할 때에는 같은 타입끼리만 가능하다.
같은 값을 가지더라도 타입이 다르다면 같은 타입으로 바꿔줘야 계산을 진행할 수 있기 때문에 형 변환을 통해 타입을 통일시켜야 한다.
묵시적 형 변환 (암시적 형 변환, 자동 형 변환)은 프로그램 실행 도중 컴파일러가 자동적으로 타입을 변환시키는 행위를 뜻한다.
묵시적 형 변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때만 발생한다.
묵시적 형 변환이 가능한 경우는 화살표 방향을 따랐을 때에만 가능하다.
위 그림에서 long -> float 는 바이트 수가 오히려 작아진다.
하지만 float 타입의 표현 범위는 (3.4 * 10^-38) ~ (3.4 * 10^38) 이고 long 타입의 표현 범위는 (-9.223372036854776 * 10^18) ~ (9.223372036854776 * 10^18) 이므로 바이트 수는 작아지더라도 표현 가능 범위는 float가 훨씬 넓기 때문에 묵시적 형 변환이 가능하다.
double a;
a = 10; //a는 10.0 이 저장된다.
"타입 변환이 필요한 이유" 에서 말한 값의 대입은 같은 타입끼리만 가능하다.는 점 때문에 발생한다.
저장되는 값은 달라지지 않았지만 해당 값을 저장하는데 할당된 바이트의 수가 4 -> 8 바이트로 증가한다.
char a = 10;
short b = 20;
auto z = a + b; //z에 저장되는 값은 30
char 타입으로 저장된 10과 short 타입으로 저장된 20 모두 int 타입으로 묵시적 형 변환이 발생하여 연산된 값이 z에 저장되고 z의 자료형은 int 타입이다.
double a = 10 + 12.3456;
1번 경우와 마찬가지로 "타입 변환이 필요한 이유" 부분에서 설명했던 연산을 수행할 때같은 타입 끼리만 가능하다.는 부분이다.
10은 int 타입이지만 타입이 같아야 계산을 진행할 수 있기 때문에 10을 10.0으로 묵시적 형 변환하여 연산을 진행한다.
명시적 형 변환 (강제 형 변환)은 사용자가 타입 캐스트 연산자 등을 사용하여 값의 타입을 강제적으로 변환시키는 행위를 뜻한다.
큰 크기의 타입은 작은 크기의 타입으로 묵시적 형변환을 진행하지 않기 때문에 프로그래머가 직접 형 변환을 진행해주어야 한다.
int iNUm = 600;
double dNum = iNum; //double이 int보다 메모리 크기가 크므로 묵시적 형변환 발생
//byte bNum = iNum; //byte의 메모리 크기가 int보다 작으므로 오류 발생
byte bNum = (byte) iNum; //명시적 형 변환을 통해 int -> byte로의 형 변환 진행
명시적 형 변환을 진행할 때 데이터의 손실이 발생할 수 있으며 손실이 발생한다면 정확한 연산을 수행할 수 없기 때문에 예상하지 못한 결과를 얻을 수 있다.
double dNum = 12.3456;
int iNum = dNum; //iNum에 저장된 값은 12, 소수점 이하의 데이터는 손실 발생
명시적 형변환은 일시적이기 때문에 피연산자의 자체 자료형에는 영향을 주지 않는다.
정수 타입을 실수 타입으로 형 변환할 때 정밀도 손실이 발생하는 경우를 피해야 한다.
int iNum1 = 123456780;
int iNum2 = 123456780;
float fNum = iNum2; //fNum에 저장되는 값은 1,23456784 * E8
iNum2 = (int) fNum; //iNum이 123456784 로 변경
int result = iNum1 - iNum2; //result의 값은 -4
float 타입은 23비트가 가수부로 배정되어 있기 때문에 23비트로 표현 가능한 값이 아니라면 근사치로 변환이 된다.
이렇게 변환한 값을 다시 int 타입으로 변환하더라도 원래의 값이 아닌 근사치로 변한 값이 int 타입으로 변하게 되므로 정밀도 손실이 발생한다.
이를 해결하기 위해서는 실수 타입으로 변환시킬 때 float 타입이 아닌 double 타입을 사용하는 것이다.
double 타입의 가수부는 52비트가 배정되어 있기 때문에 int 타입이 표현 가능한 모든 범위를 커버할 수 있다.
C++ 에서 사용되는 타입 캐스트 연산자는 다음과 같다.
C#에서는 명시적 형 변환을 위한 함수들이 정의되어 있는 Convert 클래스를 제공한다.
해당 클래스에는 To(타입명) 과 같은 이름의 형태로 정의되어 있다.
Convert 클래스를 사용할 때 형 변환이 불가능한 매개변수를 전달할 경우 예외가 발생한다.
C# 에서는 string을 제외한 대부분의 기본 타입들이 Parse() 함수를 가지고 있다.
해당 함수를 통해 문자열을 해당 타입으로 형 변환이 가능하다.
클래스 타입 간의 형 변환을 처리할 때에 사용한다.
C++의 dynamic_cast 연산자와 기능이 비슷하다.
형 변환이 제대로 이루어지지 않은 경우 null을 반환한다.
형 변환 - 위키백과
C 언어 형 변환, type casting
☕ JAVA 타입 형변환 원리 & 방법 - 완벽 정리
[Chapter 1 변수] 6. 형변환(Type Casting)
[C#] 형변환 함수 / 연산자
01.01.05. 형변환(type conversion)