자바 형변환

이정우·2021년 7월 14일
0

자바

목록 보기
2/9

자바에서 데이터 기본 데이터 타입들의 자동 형변환은

byte(1byte) -> short, char(2byte)(char의 경우 양수의 경우만 가능) -> int(4byte) -> long(8byte) -> float(4byte)(long보다 크기는 작지만 표현 범위가 넓음! 실수라서 0.000001 이런게 가능) -> double(8byte)

이런 식으로 작은 크기 -> 큰 크기 순서로 가능합니다. 여기서 오늘 공부하다 이해한 예를 들어보자면

// 우변의 상수들은 따로 명시되지 않는다면 int형을 기본 데이터형으로 갖습니다.
int a = 751;  // 이 경우 우변의 값은 따로 명시가 없기에 기본형인 int가 됩니다. 
int b = 999999999999; // 하지만 이 경우는 어떨까요?

밑의 b의 경우는 우변의 999~값이 기본형인 int형이 표현 가능한 범위를 넘어섭니다. 그렇기에 범위 초과오류가 발생합니다.

long b = 999999999999; 

이 경우를 보면 알 수 있듯이 우변의 값은 충분히 좌변의 long타입에 들어가는 범위지만 오류가 발생합니다. 그 이유는 우변 999~자체에 문제가 존재하기 때문입니다. 이 문제는 아래와 같이 해결 가능합니다.

long b = 999999999999L; 

숫자 맨 뒤에 L을 붙여서 이 정수는 int타입이 아닌 long타입이라고 명시해줍니다. 그러면 우변은 태생이 long타입이기에 long타입 숫자를 long b에 값을 초기화 해주는게 가능합니다. 좀 더 이야기 해보자면

int a = 9999999999999L;  //--1
int a = (int)9999999999999; //--2
int a = (int)(9999999999999L); //-3

1번 케이스이 경우는 우변의 long -> 좌변의 int 로 자동 형변환을 시도하였기에 오류가 나옵니다.

2번 케이스는 9999~값 자체가 int형으로 표시할 수 없으므로 범위 초과오류가 나옵니다.

3번의 경우에는 (9999999999999L)이 long값이고 이 long값을 int로 강제 형변환 후 int a값으로 초기화를 해주기에 데이터 손실은 존재하지만 실행이 가능합니다.

int의 범위는 -2,147,483,648~ 2,147,483,647 이고 long의 범위는 -9,223,372,036,854,775,808~9,223,372,036,854,775,807 인데 이를 갖고 마지막으로 설명 드리겠습니다.

int  a1  = 2147483647;	// 정상
int  a2  = 2147483648;	// 오류
long  a3  = 2147483647; // 정상
long  a4  = 2147483648; //오류

a1의 경우는 좌변과 상관 없이 우변이 int범위이므로 정상적으로 실행됩니다.

a2의 경우는 우변이 int의 범위를 +1만큼 넘었기에 좌변과 상관없이 오류가 발생합니다.

a3의 경우는 우변이 int범위안에 들기 때문에 int-> long으로 자동 형변환이 일어납니다.

a4의 경우에는 좌변은 long이기에 우변의 범위가 long안에 들어가서 정상적이라고 생각할 수 있는데 위에서 설명드렸듯이 우변은 따로 지정을 안할 경우 기본 데이터 형인 int형으로 인식하게 되고 2147483648은 int형의 범위를 +1만큼 벗어나서 범위초과 오류가 발생하게 됩니다.

추가

int값을 추가할 때 2147483648은 int 범위를 벗어났기에 오버플로우가 아닌 오류이고 2147483647+1은 오버플로우가 일어나는 경우라고 합니다.

참고 링크텍스트

profile
프로그래밍 공부 중!

0개의 댓글