CLOSE

Recommanded Free YOUTUBE Lecture: <% selectedImage %>

## 형변환

소프트웨어 공학에서 형변환은 데이터 형식을 다른 데이터 형식으로 변경하는 것을 말한다. 형변환은 필요에 따라 변경하는 암시적 형변환과 프로그래머가 직접적으로 변경하는 명시적 형변환으로 나눌 수 있다.

### 암시적 형변환

암시적 형변환은 컴파일러가 자동으로 개입해서 변환하는 형변환이다. 예를들어 서로 다른 형태의 데이터를 가지고 산술연산을 할때, 자동으로 형변환이 이루어진다.
```double d;
long l;
int i;

if(d > i) d = i;
if(i > l) l = i;
if(d == l) d *= 2;```
d, l, i는 모두 다른 데이터 형이지만 자동적으로 같은 형태로 변환된 다음 진행된다. 하지만 암시적 형변환은 가능한 사용하지 않아야 한다. 예를 들어 double 형의 데이터를 int형 변수에 대입할 경우, char 형을 int로 형변환하게 될경우 데이터를 잃어 버릴 수 있다.

암시적으로 형변환 될 경우, 어느 형으로 변환되어야 할지에 대한 기준이 있어야 할 것이다. 다음은 암시적 형변환 규칙이다.
1. 만약 연산대상(operand) 중에서 하나라도 long double형이 있다면, 다른 것들은 long double형으로 변환된다.
2. 그렇지 않다면, 만약 연산대상 중에서 하나라도 double형이 있다면, 다른 것들은 double형으로 변환된다.
3. 그렇지 않다면, 만약 연산대상 중에서 하나라도 float형이 있다면, 다른 것들은 float형으로 변환된다.
4. 그렇지 않다면, char와 short는 int형으로 변환된다.
5. 그런다음, 연산대상 중에서 하나라도 long형이 있다면, 다른 것들은 long형으로 변환된다.
만약 unsigned 자료형까지 사용한다면, 형변환 규칙은 더 복잡해 진다. 결과를 예측하기가 점점 어려워진다. 암시적 형변환을 사용을 지양하는 이유다

### 명시적 형변환

프로그래머가 형변환 연산자 ()를 이용해서 직접 형변환을 하는 방식이다. char 형 데이터와 int 형 데이터를 가지고 연산을 할 경우를 예로 들어보자.
```int i;
char c;
c = 'a';
i = (int)c;
printf("%d\n", i);
printf("%d\n", (int)c);```

### C++의 형변환

C 언어는 형변환 연산자를 () 하나만 제공한다. 반면 C++은 몇개의 새로운 형변환 연산자를 제공한다.
• static_cast
암시적 형변환이 가능한 데이터 타입을 명시적인 형변환으로 대체하는 등의 일반적인 형변환을 위한 목적으로 사용한다. 컴파일 시간에 변환
• const_cast
(상수)const를 무시하는 변환. 상수는 데이터를 보호하기 위한 좋은 방법이다. 그러나 어떤 함수들은 상수를 입력하지 못하도록 제한하기도 한다. 상수를 입력하지 못하도록 하는 이유가 있겠지만, 데이터 변경이 없는 단순 출력 혹은 잠조를 위한 함수에서도 상수를 입력하지 못하게 하는 경우도 있다. 이런 경우 const_cast 연산자를 이용할 필요가 있다.
• reinterpret_cast
C에서처럼 모든 형변환이 가능
• dynamic_cast
실행 시간에 부모 형을 자식 형으로 다운캐스팅 할때 사용