본문 바로가기

프로그래밍/C++

[C++ with Java] 형변환에 대해서 알아보자.

 

 

 

 

 

C++ Prog. with Java


C++언어를 다루고 있지만, 다른 프로그래밍 언어인 자바와 비교하면서 내용을 구성하고 합니다. 본 글은, 자바를 먼저 어느정도 알고 계시고, 저와 같이 C++ 을 공부하고자 하는 분들에게 도움이 되길 바랍니다.

 


** 데이터의 손실 **

 

  우선, 자바에서의 형변환에 대해서 조금 이야기 해봅시다.

자바에서는 형변환은 컴파일러가 해주는 자동 형변환과 개발자가 해주는 명시적 형변환, 이 두가지가 존재합니다.

하지만 자동 형변환의 경우에는 데이터가 손실될 가능성이 있기 때문에, 컴파일러가 오류를 일으킵니다.

데이터 손실을 보여드리기 위해 다음의 예를 보시겠습니다.

 

* float -> int 형으로의 자동형변환

float a = 10.12f;

int b = 0;

 

// 1. a를 b에 대입연산자를 통해 값을 복사(하지만 이경우 컴파일러가 오류를 일으킴)

// b = a;

// 2. 명시적 형변환

b = (int)a;

 

System.out.println("b의 값 : " + b);

 

[결과화면]

b의 값 : 10;

 

 위의 형변환의 경우, int형(정수) 보다 큰 타입인 float 타입(실수)의 데이터가 작은 타입으로 형변환하는 것입니다.

이때, 소수점 이하의 수가 버려지는 것을 볼 수 있습니다. 결국 데이터의 손실이 일어난 것인데요,

자바는 이런 경우에 대해서 책임을 지지 않기 때문에, 컴파일시 오류를 일으킵니다.

 

 반면에, C++의 경우에는 이런 데이터 손실에 대한 책임을 묻지도 않습니다.

다음의 소스를 보시죠.

#include <iostream>
using namespace std;

 

int main(){
 int i = 0;
 float f = 10.12f;

 i = f;

 cout << i << "\n";
}

 

 이상없이 10 이라는 결과물을 출력합니다. 소수점 이하의 수가 사라진 값이죠.

단지, 콘솔창에 다음과 같이 경고를 합니다.

'float'에서 'int'(으)로 변환하면서 데이터가 손실될 수 있습니다.

 

 이런 점에서, 개발자는 형변환에 있어서 자바보다 유의해야합니다.

 

 

** 명시적 형변환 **

 

 C++도 자바처럼 명시적 형변환이 가능한데요, 다음과 같이 두가지 방법으로 가능합니다.

1. (변환될 타입)변수    ex) (int) float 타입의 변수

2. 변환될 타입(변수)    ex) int(float 타입의 변수);

 

 명시적 형변환을 하게 될 경우, 바로 위에 보이는 메시지가 나타나지 않게 됩니다. 

  

 두번째 방법의 경우는 자바만 해보신 분들의 경우에 조금 특이해 보일 수도 있는데요,

많이 쓰이는 방법이라 하니 알아두시는게 좋을듯 합니다.

 이상 짧게 정리한 형변환 입니다. 형변환의 경우, 다형성이나 상속 등등 다양하게 활용되니 꼭 숙지하시킬 바랄게요.