프로그래밍을 하다보면 문자열로 입력받은 변수를 숫자로 변환해서 계산하고 싶은 경우, 문자열에 숫자값을 추가하고 싶은 경우 등 변수형을 다른 형으로 변환이 필요한 경우가 많음
형변환은 주로 기본형 변수인 정수 ↔ 실수 ↔ 문자 들 사이에서 일어남
정수 ↔ 실수 간에 변환할때는 ({원하는 타입}) 명령을 통해 변환할 수 있습니다. (캐스팅: 명시적 형변환)
정수형 ↔ 실수형
Double, Float to Int
(Int)캐스팅 방식으로 실수를 정수로 치환하는 방법. 이때 실수형의 소수점아래자리는 버려진다.
double doubleNumber = 10.101010;
float floatNumber = 10.1010
int intNumber;
intNumber = (int)doubleNumber; // double -> int 형변환
intNumber = (int)floatNumber; // float -> int 형변환
Int to Double, Float
(Double,Float) 캐스팅으로 정수형을 실수형으로 변환하는 방법
int intNumber = 10;
double doubleNumber = (double)intNumber; // int -> double 형변환
float floatNumber = (float)intNumber; // int -> float 형변환
자동 형변환
Java 프로그래밍에서 형변환을 직접적으로 캐스팅하지 않아도 자동으로 형변환 되는 케이스가 있다.
프로그램 실행 도중에 값을 저장하거나 계산할때 자동으로 타입변환이 일어남
1. 자동 타입변환은 작은 크기의 타입에서 큰 크기의 타입으로 저장될때 큰 크기로 형변환이 발생한다.
변수 타입별 크기 순서
byte(1) → short(2) → int(4) → long(8) → float(4) → double(8)
byte byteNumber = 10;
int intNumber = byteNumber; // byte -> int 형변환
System.out.println(intNumber); // 10
char charAlphabet = 'A';
intNumber = charAlphabet; // char -> int 형변환
System.out.println(intNumber); // A의 유니코드 : 65
intNumber = 100;
long longNumber = intNumber; // int -> number 형변환
System.out.println(longNumber); // 100
intNumber = 200;
double doubleNumber = intNumber; // int -> double 형변환
System.out.println(doubleNumber); // 200.0 (소수점이 추가된 실수출력)
2. 작은 크기의 타입이 큰 크기의 타입과 계산될때 자동으로 큰 크기의 타입으로 형변환이 발생합니다.
int intNumber = 10;
double doubleNumber = 5.5;
double result = intNumber + doubleNumber; // result 에 15.5 저장됨 (int -> double)
intNumber = 10;
int iResult = intNumber / 4; // iResult 에 2 저장됨 (int형 연산 -> 소수점 버려짐)
intNumber = 10;
double dResult = intNumber / 4.0; // dResult 에 2.5 저장됨 (double형 연산 -> 소수점 저장)
자동 형변환 vs 강제 형변환
- 작은 타입 > 큰 타입 형변환시 (자동 형변환)
- 더 큰 표현범위를 가진 타입으로 변환되는것이라 값의 손실이 없습니다.
- 값의 손실없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환을 해줍니다.
- 큰 타입 > 작은 타입 형변환시 (강제 형변환 = 캐스팅)
- 더 작은 표현범위를 가진 타입으로 변환된는것이라 값의 손실이 생깁니다.
- 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 합니다.