참고 자료:
형변환
자바에서는 타입이라는 게 존재하는데 이는 다음과 같은 것들이다.
- int
- long
- double
- boolean
- ...
그리고 자바에서는 작은것을 큰 곳에 넣을 수 있다. 같은 정수를 다루는 int, long은 int보다 long이 더 큰 범위를 가진다. 즉, 담는 그릇 자체가 더 크단 이야기인데 이 말은 int로 선언한 변수의 값은 long에 담을 수 있다. 그리고 이는 내가 명시적으로 작성하지 않아도 자동 형변환이 된다.
그렇다면 큰 것을 작은 그릇에 담으려면 어떻게 될까? 컴파일 오류가 발생한다.
그러나, 죽어도 변경해야 한다면 또는 값의 유실이 생기더라도 변경을 해야겠다면 명시적 형변환을 할 수 있다.
그리고 이 결과는 iv라는 int형 변수에 담긴 값은 3.5가 아닌 3이 된다. 왜냐하면 int라는 타입은 정수만을 취급하기 때문이다. 그래서 형변환 시 이런 경우를 조심해야 한다.
형변환 시 Overflow
그럼 만약에 int가 다룰 수 있는 최대 범위를 초과하는 long 변수의 값을 int 변수에 담으려고 하면 어떻게 될까? Overflow가 발생한다.
int 형 변수가 다룰 수 있는 범위는 -2147483648 ~ 2147483647이다. 그리고 '2147483648' 이 값은 그 범위를 초과하기 때문에 Overflow가 발생해서 값의 역이 일어난다. 그러니까 결론은 이런짓을 하면 안된다.
연산 시 형변환
연산을 할 때 기억할 대원칙 2가지가 있다.
- 같은 타입끼리 계산할 땐 같은 타입으로 계산이 된다.
- 다른 타입끼리 계산하면 더 큰 타입으로 자동 형변환이 일어난다.
이 두가지만 알면 연산 시 발생하는 에러는 고민할 필요가 없다. 예를 들어 이 결과를 예측해보자.
3을 2로 나누면 1.5가 되는데 과연 이 결과는 뭐가 나올까? 1이 된다. 그 이유는 int / int 연산은 같은 타입이므로 int로 계산이 된다. 그럼 1.5는 1로 변경이 된다. 그리고 그 값을 int 타입 변수에 대입을 하면 역시나 int = int이므로 int 타입으로 대입이 된다. 그러므로 1이라는 값이 나온다. 즉, 만약 1.5를 기대했다면 잘못된 코드인것.
그럼 다음과 같이 작성하면 될까? 이 결과는 1.0이 된다.
왜냐하면 int(3) / int(2)는 같은 int 타입끼리의 계산이므로 1이 된다. 그리고 그 값을 double이라는 변수에 대입하는데 double이 int보다 더 큰 타입이므로 자동 형변환이 되어 1.0이 변수에 들어가게 된다.
그러면 도대체 1.5가 나오게 하려면 어떻게 해야하는 걸까? 3을 2로 나눌 때 double 타입으로 만들면 된다.
즉, 3이라는 int형 변수를 double로 형변환을 해서 3.0을 만들면 된다. 그럼 3.0 / 2가 되고 double / int가 되니까 더 큰 타입으로 자동 형변환이 된다. double(3.0) / double(2.0) 이 계산되어 1.5라는 값이 나오고 그 값이 double 형 변수에 담기기 때문에 1.5가 출력된다.
그래서 연산 시 형변환은 딱 두가지만 기억하자.
- 같은 타입끼리 계산할 땐 같은 타입으로 계산이 된다.
- 다른 타입끼리 계산하면 더 큰 타입으로 자동 형변환이 일어난다.
'JAVA의 가장 기본이 되는 내용' 카테고리의 다른 글
객체 지향 프로그래밍 (0) | 2024.03.26 |
---|---|
NullPointerException (0) | 2024.03.25 |
Null / GC (Garbage Collection) (0) | 2024.03.25 |
JAVA는 항상 변수의 값을 복사해서 대입한다. (0) | 2024.03.25 |
JAVA란 (0) | 2024.03.18 |