타입변환
하나의 자료형을 다른 자료형으로 바꾸것을 의미함
boolean형을 제외하고는 모두 변환 가능함.
- 자동 타입 변환 : Promotion
메모리가 큰것에서 작은것으로는 초과되는 것이기에 불가능하나, 작은 것에서 큰것으로는 변경이 가능하다.
아래를 보면
double result = 4.5f + 4.2;
System.out.println(result); //---> 정상
float result8 = 4.5f + 4.2;
System.out.println(result8); //---> 오류
첫번째/ double형 함수에 float형과 double형이 연산되고 있다. 이때는 double>float이기때문에 문제가 없다.
두번째/ 반대로 float형 함수는 double형 보다 메모리가 적기 때문에 double이 포함된 연산식은 불가능하다.
btye(1) < short(2) < int(4) < long(8) < float(4) < double(8)
문자형일때도 char<int이기에 아스키 코드로 자동으로 변경되어 계산된다.
char ch = 'a';
int result5 = ch + '1';
System.out.println(result5); //-->146
예외적인 상황도 있다.
btye타입은 char보다 작은데, 오류가 발생한다.
왜냐하면 char타입의 허용범위는 음수를 포함하지 않는데, byte타입은 음수를 포함하기 때문이다.
- 강제 타입 변환 : Casting
자동 타입 변환이 불가능한 경우 (데이터 메모리가 더 작은 것으로 바뀔 수 없을 경우) 를 강제적으로 개발자가 설정해줄수 있다.
방법은 변경시킬 변수앞에 (변경시킬 데이터형)을 작성하면 된다.
long num3 = 4l;
int num4 = 4;
int result4 = (int)num3 + num4;
System.out.println(result4);
예를 들면, 위에 코드처럼 int형 변수에서 long형과 int형 데이터를 연산하려면 long형 데이터를 int형으로 메모리를 낮춰주어야 가능하다. 그래서 num3앞에 (int)를 작성해서 강제로 메모리를 낮춰주었다,
굉장히 헷갈렸던 부분은 아래 부분이다.
double result1 = 1 / 4;
System.out.println(result1); //--> 0.0
double result1 = (double)(1 / 4);
System.out.println(result1); //--> 0.0 --> 1/4가 먼저 계산되어 0이 되기때문에 0.0이 됨
double result1 = (double)1 / 4;
System.out.println(result1); //--> 0.25
double result1 = 1 / (double)4;
System.out.println(result1); //--> 0.25
double result1 = (double)1 / (double)4;
System.out.println(result1); //--> 0.25
연산에 대한 결과는 기본적으로 int형으로 나오기 때문에, 1/4의 결과 값이 0.25가 아닌 0.0이 나온다.
연산앞에 리터널앞에 강제로 double형으로 변경했더니 정상적인 소수점 값으로 나왔다.
결과값에 따라 자료형이 달라지는 것이지, 자료형에 따라 결과값이 달라지는 것은 아님을 명심하자
문자열을 기본 타입으로 강제 타입 변환
String -> byte | .parseByte() |
String -> short | .parseShort() |
String -> int | .parseInt() |
String -> long | .parseLong() |
String -> float | .parseFloat() |
String -> double | .parseDouble() |
String -> boolean | .parseBoolean() |
반대로 문자열로 변경
valueOf()