2023. 12. 21. 13:16ㆍJava
◎ 형변환
-> 변수나 리터럴의 타입을 다른 타입으로 변환하는 것
-> 기본적인 형변환 방법은 '(타입) 피연산자'의 형태로 선언하여 형변환을 한다.
◎ 자동 형변환
-> 형변환을 따로 명시하지 않아도 자동으로 형변환이 되는 것
-> 작은 범위에서 큰 범위로는 값을 넣을 수 있기 때문에 이 경우 자동으로 형변환이 된다.
- 위 코드에서 1번 주석은 int 형인 iv가 long형인 lv 변수에 들어가면서 자동으로 long 형으로 형변환이 된다.
long이 int보다 더 큰 숫자 범위를 표현하기 때문에 자동 형변환이 발생한다.
- 2번은 int가 실수형인 dobule로 자동 형변환이 되면서 10.0이 출력이 된다.
- 3번은 double이 부동 소수점을 사용하기 때문에 long보다 범위가 크므로 double형으로 자동 형변환이 발생한다.
- 다음은 위 코드 2번 코드의 형변환 과정이다.
dv = iv;
dv = (double) iv; // 형변환
dv = (double) 10;
dv = 10.0;
- 적은 숫자 범위 타입에서 큰 숫자 범위 타입으로 대입 시 위 과정이 자동으로 이루어진다.
◎ 명시적 형변환
-> 큰 범위에서 작은 범위로 타입을 변경하는 경우에는 형변환을 명시해야 한다.
- 큰 범위인 double형의 dv가 더 작은 범위인 int형의 iv로 대입되는 코드다.
- 이전 자동 형변환 처럼 iv = dv;만 작성할 경우 컴파일 오류가 발생하기 때문에 iv = (int) dv와 같이 직접 변환할 타입을 변수 앞에 붙여 코드를 작성한다.
- int 형은 double형보다 숫자를 표현할 수 있는 범위가 적고 실수를 표현할 수 없다. 따라서 명시적으로 형 변환을 하면 기존 값이 손실될 수 있다. 10.5를 int형으로 변환하면 int형은 소수점을 표현할 수 없기 때문에 소수점 값이 손실된다.
◎ 오버플로우
-> 다음은 변수에 표현할 수 있는 범위를 넘는 숫자를 대입하는 경우다.
- 결과
- int가 표현할 수 있는 최댓값은 214783647이다. 해당 값이 들어간 maxIv는 int형으로 형변환이 되어도 정상적으로 값을 출력하지만, 최댓값이 넘어가는 maxIntOver를 int형으로 형변환하여 출력하면 다른 값이 출력된다.
-> 이처럼 표현할 수 있는 범위를 초과하여 전혀 다른 숫자가 표현되는 것을 오버플로우라고 한다.
◎ 형변환을 이용한 계산
-> 다음은 계산과정에서 형변환이 발생하는 경우다.
- 1번 : 같은 타입 간의 계산은 같은 타입의 결과가 나온다.
- 2번 : int형 간의 계산의 결과가 double형인 div2에 대입이 되므로 해당 결과가 double형으로 자동 형변환이 발생하여 결과는 1이 아닌 1.0이 출력된다.
- 3번 : 3.0은 double, 2는 int형으로 서로 다른 타입 간의 계산이다. 이 경우 큰 범위의 타입으로 자동 형변환이 발생한다.
double div3 = 3.0 / 2;
double div3 = 3.0 / (double) 2;
double div3 = 3.0 / 2.0;
double div3 = 1.5;
- 3번은 위의 과정을 거쳐 2가 double형으로 형변환되어 계산된다.
- 4번 : int 형 간의 계산에서 3을 double형으로 형변환을 하였다. 이렇게 되면 double형과 int형 간의 계산이 되므로 3번 처럼 int형인 2가 더 큰 범위의 타입인 double형으로 자동 형변환되어 계산된다.
- 5번 : 변수를 사용하는 경우에도 형변환은 똑같이 발생한다.
★ 참고
'Java' 카테고리의 다른 글
메서드 (0) | 2024.01.17 |
---|---|
배열 (0) | 2024.01.13 |
스코프 - 지역 변수 (1) | 2023.12.21 |
얕은 복사 & 깊은 복사 (0) | 2023.01.03 |
컬렉션 프레임워크 - Comparator & Comparable (0) | 2022.07.21 |