자바 형변환
자바에서 데이터 기본 데이터 타입들의 자동 형변환은
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은 오버플로우가 일어나는 경우라고 합니다.
참고 링크텍스트
Author And Source
이 문제에 관하여(자바 형변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tkdeod1234/자바-형변환저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)