자동 타입 변환은 말 그대로 자동으로 타입 변호나이 일어나는 것을 말한다. 자동 타입 변환은 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다.
- 허용범위가 작은 타입이 허용 범위가 큰 타입만 가능!
byte < short, char < int < long < float < double
byte x = 10;
int y = x; // int가 더 크므로 자동 타입 변환됨.
long x = 5000000000L;
folat y = x; // 5.0E9F 저장됨
double z = y; // 5.0E9 저장됨
char x = 'A';
int y = x; // 65가 저장됨
- 예외!
byte보다 char가 허용 범위가 넓으나, byte는 char로 자동 변환될 수 없다.
char 타입은 음수를 포함하지 않기 때문!
byte x = 65;
char y = x; // 컴파일 에러!
큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 변환될 수 없다.
다만 강제 타입 변환(casting)을 통해 강제로 변환시킬 순 있다.
//casting. byte단위로 앞자리를 짤라서 강제로 변환하다고 보면 된다.
작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입;
int x = 10;
byte y = (byte) x; // 강제 타입 변환
double x = 3.14;
int y = (int) y; // 정수 부분인 3만 저장
자바는 컴파일 단계에서 연산을 수행한다. 아래의 식은 컴파일 단계에서 byte 타입 X에 30이라는 값을 저장해둔다.
byte x = 10 + 20;
- 정수 연산
그러나 변수가 피연산자로 사용되면 실행 시 연산을 수행한다. 정수 타입 연산자가 산술 연산식에서 비연산자로 사용되면
int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행한다.
byte x = 10;
byte y = 20;
byte result = x + y // 컴파일 에러
int result = x + y; // 정상
- 실수 연산
float x = 1.2f + 3.4f; //float x = 4.6f;
// 피연산자 중 하나가 double 타입이면 double 타입으로 변환된다.
double x = 1.2f + 3.4; // double x = 4.6;
- int와 double의 연산
int x = 10;
double y = 5.5;
double z = 10 + 5.5 // 10.0 + 5.5
// int 타입으로 연산하려면 강제 변환하여 수행한다.
int x = 10;
double y = 5.5;
int z = x + (int) y // 10 + 5
자바에서 피연산자 중 문자열이 있을 경우 나머지 피연산자도 문자열 결합 연산을 수행한다.
int x = 3 + 7; // 10
String str = "3" + 7; // "37"
String str = "3" + "7"; // "37"
String str = 1 + 2 + "3"; // 3 + "3" -> "33"
String str = 1 + "2" + 3; // "123"
String str = "1" + (2+3); // "1" + 5 -> "15"
문자열을 숫자 타입으로 변환하는 경우가 많다. 다음과 같은 방법으로 변환 가능하다.
String str = "1000";
byte x = Byte.parseByte(str);
short x = Short.parseShort(str);
int x = Integer.parseInt(str);
long x = Long.parseLong(str);
float x = Float.parseFloat(str);
double x = Double.parseDouble(str);
boolean x = Boolean.parseBoolean(str);
반대로 기본 타입을 문자열로 바꾸려면 아래와 같이 처리하면 된다.
String str = String.valueOf(기본값);