Yoon DevLog
article thumbnail

 

형변환(캐스팅, casting)

모든 변수와 리터럴에는 타입이 있다. 프로그래밍을 하다보면 같은 타입뿐만 아니라 서로 다른 타입간의 연산을 수행해야하는 경우가 많다. 이럴 때는 연산을 수행하기 전에 타입을 일치시켜야 한다. 


형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것


예를들어, int 타입의 값과 float 타입의 값을 더하는 경우, 먼저 두 값을 같은 타입으로 즉, 둘 다 float타입으로 변환한 다음에 더해야 한다.

 

 

형변환 방법

형변환 방법은 형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주면 된다.

double d = 95.4;
int score = (int)d; // double 타입의 변수 d를 int타입으로 형변환

--------------------------------------------------------

   int score = (int)d;
-> int score = (int)85.4;  // 변수 d의 값을 읽어와서 형변환 한다.
-> int score = 85;         // 형변환의 결과인 85를 변수 score에 저장

위에 코드에서 알 수 있듯이, 피연산자인 변수 d의 값은 형변환 후에도 아무런 변화가 없다.

 

기본형(primitive type)에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.

그리고, 기본형과 참조형간의 형변환은 불가능하다.

 

[JAVA] 기본형 타입(Primitive Type) vs 참조형 타입(Reference Type)

자바에서는 크게 기본형 타입(Primitive Type), 참조형 타입(Reference Type)이 있다. 자바는 C언어와 달리 참조형 변수 간의 연산을 할 수 없다. 고로 실제 연산에 사용되는 것은 모두 기본형 변수이다.

y-it.tistory.com

 

주의할 점은 float타입의 값을 int타입으로 변환할 때 소수점 이하의 값은 반올림이 아닌 버림으로 처리된다.

 

 

정수형 간의 형변환

큰타입에서 작은타입으로 변환하는 경우 크기의 차이만큼 데이터의 손실이 발생한다.

반대로 작은타입에서 큰타입으로 변환하는 경우는 데이터가 손실되지 않는다.

 

short small;
int big; 

big = 500000; 
small = (short)big; 
System.out.println(small); // -24288 데이터 손실이 발생하였다.

small = 30000;
big = (int)small; 
System.out.println(big); // 500 데이터 손실이 발생하지 않았다.

 

 

자동 형변환

서로 다른 타입간의 대입이나 연산을 할 때, 형변환으로 타입을 일치시키는 것이 원칙이지만,

경우에 따라 편의상의 이유로 형변환을 생략할 수 있다! 왜냐하면 컴파일러가 생략된 형변환을 자동적으로 추가하기 때문이다!

float f = 1234;   // 형변환의 생략
float f = (float)1234; // 위와 아래는 같이 작동

위에 코드에서 1번째 줄 리터럴은 int타입의 상수이고, 이 값을 저장하려는 변수의 타입은 float이다.

서로 타입이 달라서 형변환이 필요하지만 편의상 생략 가능하다. float타입의 변수는 1234라는 값을 저장하는데 아무런 문제가 없기 때문이다.

 

byte b = 1000; // Error! byte의 범위(-128~127)를 넘는 값을 저장해서..

위와 같이 코딩했을 경우 에러가 발생한다. 값 손실이 발생할 수 있다는 문구를 표기한다.

'incompatible types: possible lossy conversion from int to byte'

 

char ch = (char)1000; // 명시적 형변환 -> Error가 발생하지 않는다.

하지만 이렇게 명시적으로 형변환을 해줬을 경우, 프로그래머의 의도로 간주하고 컴파일러는 에러를 발생시키지 않는다.

 

int i = 3;
double d = 1.0 + i; // double d = 1.0 + (double)i; 에서 형변환이 생략된 소스

위와 같은 계산식에서도 형변환이 자주 생략되는데, 서로 다른 두 타입의 연산에서는 먼저 타입을 일치시킨 다음에 연산을 수행해야 하므로, 연산과정에서 형변환이 자동적으로 이루어진다!

서로 다른 두 타입간의 덧셈에서는 두 타입 중 표현범위가 더 넓은 타입으로 형변환하여 타입을 일치시킨 다음에 연산을 수행한다.

-> 이는 값손실의 위험을 더 줄이고, 올바른 결과를 얻을 확률이 높기 때문이다!

 

 

profile

Yoon DevLog

@usnooy._.

백엔드 개발자 성장일기 -