Java 타입 변환

김범준·2022년 11월 8일
0

Java

목록 보기
1/11

이전에 타입이 많다는 것은 알았다.
그렇다면 int로 사용하다 크기 때문에 만들어 놓은 long변수에 대입할 수 있을까?

자동 형변환

가능하다. 크기로 보면 작은 놈을 큰놈에다 때려맞추는 식이라 손실이 없기 때문이다.

int i = 2000000000;
long l = i;

이말은 작은 범위를 큰 범위에 변환은 가능하다는 말이다.
byte < short < int < long < float < double

그렇다면 char의 범위는 2의 16제곱-1 인 65535이다. 반면 고작 127의 범위를 가진 byte를 char로 변환하려고 하면 괜찮을까?
이는 음수를 생각해야 한다. 어찌보면 char이 범위가 커보이지만 byte는 -128까지 가지며 만약 음수가 char에 들어가면 어떻게 될까?
당연히 에러가 뜰것이다.

연산

연산(+, -, *, /, %)시에도 이러한 형변환이 일어난다. 만약 정수형의 변수타입이 피 연산자로 사용되면 int값이 반환된다.

byte var1 = 1;
byte var2 = 2;
int var3 = var1 + var2;

위와 같이 연산시 해당 값은 int타입이다. 그렇다면 이를 byte에 담게 되면 어떻게 될까?

byte var1 = 1;
byte var2 = 2;
byte var3 = var1 + var2;//에러 발생

당연히 에러가 난다. 범위가 큰 int형을 byte에 담으려고 했으니 에러가 날 수 밖에 없다. 때문에 연산시 결과가 int형으로 나오며 이를 담을때는 해당 타입의 범위를 생각하는 과정이 필요하다.

컴파일 단계

이러한 형 변환은 당연히 타입은 변경하면서 추가 연산된다. 위에서 변수 + 변수 면 컴파일 단계에서 변수값을 가져오고 연산을 하게 된다. 하지만 숫자 그대로 연산을 하게 되면 이는 컴파일 단계에서 바로 연산하고 값을 집어넣기 때문에 속도가 더 빠르다.

강제 형변환

그렇다면 반대는 어떻게 될까?
만약 long로 int의 범위를 벗어나는 숫자를 만들어놓고 int에 대입하면 어떻게 될까?

long l = 3000000000L; //int형은 최대 2,147,483,647까지 저장할 수 있다.
int i = l; //에러 발생

결과적으로는 에러가 나난다. 작은 냄비에다 큰냄비에 내용물을 부으면 넘치듯 손실이 일어날것을 컴퓨터는 알기 때문이다.
그래도 만약 이부분이 예측내에 있다면 이를 강제적으로 행할 수 있다.

long l = 3000000000L; 
int i = (int)l;
System.out.println(i);
//-1294967296

보면 에러없이 작동은 한다. 하지만 우리가 예측한 결과일까?
저 값 자체는 우리가 예상한 값은 아니지만 값은 overflow라고 해당 값이 넘치게 되면 범위중 가장 낮은 곳에서 다시 시작하는 현상이 일어나 저 값을 가지게 된다.

profile
그럴싸한 계획을 가지고 있는

0개의 댓글