형 변환
예)
4 byte 크기의 int 변수 값을 8 byte 크기의 long 변수에 할당하면 에러없이 잘 동작한다.
public static void main(String[] args) {
int normalNumber = Integer.MAX_VALUE;
long bigNumber = normalNumber;
System.out.println(normalNumber);
System.out.println(bigNumber);
}
그 이유는 메모리 크기 때문인데
long 형과 int 형의 2진수 범위를 보면 long 형이 int형보다 두 배 많은 정보를 담을 수 있게되어있다.
long의 범위가 훨신 크기때문에 int 값을 할당하는데 문제가 없다.
이런 특징을 “묵시적 형변환“ 이라고 한다.
byte -> short -> int -> long 은 모두 “묵시적 형변환"을 한다.
반면, 크기가 큰 long 형의 값을 비교적 작은 int형으로 자연스러운 변환은 불가능하다.
public static void main(String[] args) {
long bigNumber = Long.MAX_VALUE;
int normalNumber = bigNumber; <- 에러!
System.out.println(bigNumber);
System.out.println(normalNumber);
}
public static void main(String[] args) {
long bigNumber = Integer.MAX_VALUE + 1L;
int normalNumber = (int) bigNumber;
System.out.println(bigNumber);
System.out.println(normalNumber);
}
정수오버플로우
범위를 벗어난 수를 넣었을 때,
할당 값이 이상해지는 경우가 종종 발생할 수 있다.
할당할 수 있는 범위를 초과하는 버그가 발생하기 때문
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
int normalNumber = Integer.MAX_VALUE + 1;
System.out.println(normalNumber);
}
음수로 나오는 버그가 발생하게 되는데, 그렇다고 명시적 형변환을 안써도 안된다. (치명적 보안 취약점)
이런 오류가 뜨는 이유는 2진법 때문 - 정수오버플로우
public static void main(String[] args) {
long longNumber = 2147483649L; <- int 최대 값보다 2큽니다.
System.out.println(longNumber);
int normalNumber = (int) longNumber;
System.out.println(normalNumber);
}
명시적 형변환의 주의점
명시적 형변환을 할 때, 항상 정수 오버플로우가 발생하지 않도록 주의를 기울어야 한다.
정수 <-> 부동소수점의 변환 (진짜진짜많이씀)
public static void main(String[] args) {
int num = 10;
float fnum = num;
double dnum = num;
System.out.println(num); // 10
System.out.println(fnum); // 10.0
System.out.println(dnum); // 10.0
}
public static void main(String[] args) {
float fnum = 10.9f;
int num = (int) fnum;
System.out.println(fnum); // 10.9
System.out.println(num); // 10
double dnum = 11.15;
num = (int) dnum;
System.out.println(dnum); // 11.15
System.out.println(num); // 11
}
부동소수점 소수점 처리
public static void main(String[] args) {
double dnum = 10.1;
// 소수점 올림.
dnum = Math.ceil(dnum);
System.out.println(dnum); // 11.0
// 소수점 버림.
dnum = 10.9;
dnum = Math.floor(dnum);
System.out.println(dnum); // 10.0
// 소수점 반올림.
dnum = 15.18;
dnum = Math.round(dnum);
System.out.println(dnum); // 15.0
dnum = 10.56;
dnum = Math.round(dnum);
System.out.println(dnum); // 11.0
}
public static void main(String[] args) {
// 29.37 을 29.4로 올림 처리하기
double dnum = 29.37;
double dnum2 = dnum * 10;
System.out.println(dnum2); // 293.7
dnum2 = Math.round(dnum2);
System.out.println(dnum2); // 294.0
double dnum3 = dnum2 / 10;
System.out.println(dnum3); // 29.4
}
문자열 형변환
- 문자열을 byte, short, int, long, float, double, boolean으로 변환 (총 8가지 Primitive Type)
- Java는 문자열을 Primitive Type으로 변경이 가능
문자열을 정수로 변환하려면 타입.parseType(문자) 를 사용
public static void main(String[] args) {
String numberString = "10";
byte byteNumber = Byte.parseByte(numberString);
System.out.println(byteNumber);
numberString = "10000";
short shortNumber = Short.parseShort(numberString);
System.out.println(shortNumber);
numberString = "1000000";
int intNumber = Integer.parseInt(numberString);
System.out.println(intNumber);
numberString = "1000000000";
long longNumber = Long.parseLong(numberString);
System.out.println(longNumber);
}
int 만 다르니 주의
public static void main(String[] args) {
String numberString = "A";
byte byteNumber = Byte.parseByte(numberString);
System.out.println(byteNumber);
} // Exception in thread "main" java.lang.NumberFormatException: For input string: "A"
public static void main(String[] args) {
String numberString = "10.5";
byte byteNumber = Byte.parseByte(numberString);
System.out.println(byteNumber);
} // Exception in thread "main" java.lang.NumberFormatException: For input string: "10.5"
문자열을 부동소수점으로 변환하려면 타입.parseType(문자) 를 사용한다.
public static void main(String[] args) {
String numberString = "10.5";
float floatNumber = Float.parseFloat(numberString);
System.out.println(floatNumber);
numberString = "11.577777777";
double doubleNumber = Double.parseDouble(numberString);
System.out.println(doubleNumber);
numberString = "12";
double doubleNumber2 = Double.parseDouble(numberString);
System.out.println(doubleNumber2);
}
문자열을 불린으로 변환하려면 Boolean.parseBoolean(문자) 를 사용한다.
public static void main(String[] args) {
String str = "true";
boolean bool = Boolean.parseBoolean(str);
System.out.println(bool); // true
str = "TRUE";
bool = Boolean.parseBoolean(str);
System.out.println(bool); // true
str = "tRue";
bool = Boolean.parseBoolean(str);
System.out.println(bool); // true
}
public static void main(String[] args) {
String str = "false";
boolean bool = Boolean.parseBoolean(str);
System.out.println(bool); // false
str = "";
bool = Boolean.parseBoolean(str);
System.out.println(bool); // false
str = "anystring";
bool = Boolean.parseBoolean(str);
System.out.println(bool); // false
}
이 불린 변환은 잘 쓰지 않음 그냥 참고만