-> 데이터 타입을 다른 타입으로 자동적으로 변환하는 것
-> 값의 허용 범위가 작은 타입이 큰 타입으로 대입될 때 발생함
ex) 큰 허용 범위 타입 = 작은 허용 범위 타입 에서
작은 범위 타입이 큰 허용 범위 타입으로 자동적으로 변환됨
-> 컴파일 때 대입되는 타입을 확인하고 변환함
-> 값이 변수일 때는 변수의 타입 (byte의 크기)를 확인함
-> 기본 타입의 허용 범위 순
byte < short, char < int < long < float < double
-> 그러나 char 타입보다 작은 byte 타입은 char 타입으로 자동 변환이 불가능 함
public class PromotionExam {
public static void main(String[] args) {
byte byteValue = 10;
int intValue = byteValue;
// int가 byte보다 범위가 더 넓기 때문에 int 타입의 값으로 변환
System.out.println(intValue); // 10
char charValue = '가';
intValue = charValue;
// int가 char보다 범위가 더 넓으므로 int 타입의 값으로 변환 (char 타입 값은 유니코드 값으로 변환됨)
System.out.println(intValue); // 44032
intValue = 50;
long longValue = intValue;
// long이 int보다 범위가 더 큼, int 타입의 값으로 변환
System.out.println(longValue); // 50
longValue = 100;
float floatValue = longValue;
// float이 long보다 범위가 더 큼, float 타입의 값으로 변환
System.out.println(floatValue); // 100.0
floatValue = 100.5f;
double doubleValue = floatValue;
// double이 float보다 범위가 더 큼, double 타입의 값으로 변환
System.out.println(doubleValue); // 100.5
}
}
-> byte 값의 큰 타입의 값을 작은 타입의 값으로 변환하는 등 원하는 타입의 형태로 값을 도출할 때 사용
-> 변환하고자 하는 타입을 괄호 안에 넣고 뒤에 값 또는 변수 선언
ex) int value = (int) longvalue;
public class CastingExample{
public static void main(String[] args) {
int var1 = 10;
byte var2 = (byte) var1;
//var1이 int 타입의 변수고, byte가 int보다 byte가 더 작음, byte 타입으로 변환해야함
System.out.println(var2); //10
long var3 = 300;
int var4 = (int) var3;
//var3이 long 타입의 변수, int가 long보다 byte가 더 작음, int 타입으로 변환해야함
System.out.println(var4); //300
int var5 = 65;
char var6 = (char) var5;
//var5가 int 타입의 변수, char이 int보다 byte가 더 작음, char 타입으로 변환해야함 (변환 시 ascii 코드 값의 문자로 나옴)
System.out.println(var6); //A
double var7 = 3.14;
int var8 = (int)var7;
//var7이 double 타입의 변수, int가 double보다 byte가 더 작음, int 타입으로 변환해야함 (변환시 소수점 잘려나감, 반올림 x)
System.out.println(var8); // 3
}
}
-> 정수 타입의 산술연산식의 경우에는 int 타입보다 작은 byte, short타입의 값이나 변수가 자동적으로 int 타입으로 변환함
-> byte나 short 타입의 변수나 값이 피연산자로 사용되면 int 타입으로 저장되기 때문에 연산식의 결과값은 int 타입으로 저장해야 함
ex) (타입) (연산식); 의 형태
-> 산술 연산식에 long 타입의 변수나 값이 있을 경우 결과 값이 자동적으로 long 타입으로 변환됨
-> 정수간의 연산식을 실수 타입에 저장할 경우 소수점 값이 사라짐
-> 따라서 실수 형태로 나타내기 위해서는 피연산자를 실수 형태로 강제 형변환 해야함
ex) 정수 / 정수 = 정수
정수 / 실수 = 실수
public class OperationPromotion{
public static void main(String[] args) {
byte result1 = 10 + 20;
// 컴파일 단계에서 연산 후 정수 타입으로 확인함
System.out.println("result1: " + result1);
byte v1 = 10;
byte v2 = 20;
int result2 = v1 + v2;
// 컴파일 단계에서 자동으로 int 타입으로 확인됨
System.out.println("result2: " + result2);
byte v3 = 10;
int v4 = 100;
long v5 = 1000L;
long result3 = v3 + v4 + v5;
// long 타입의 변수값이 있을 경우 연산 식이 long 타입으로 변환됨
System.out.println(result3);
char v6 = 'A';
char v7 = 1;
int result4 = v6 + v7;
// 컴파일 단계에서 자동으로 int 타입으로 변환됨 (v7의 경우 ascii 코드 값으로 도출됨)
System.out.println(result4);
int v8 = 10;
int result5 = v8 / 4;
//정수/정수 = 정수 (반올림 x) : 타입을 float/double로 바꾸더라도 정수로 나누면 소수점 값은 사라짐
System.out.println(result5);
double result6 = v8 / 4.0;
//정수/실수 = 실수 : 실수로 나누기 위해서는 꼭 소수점을 찍어야함. double 타입으로 변환됨
System.out.println(result6);
int v9 = 1;
int v10 = 2;
double result7 = (double) v9 / v10;
// int가 double보다 byte값이 작으므로 double로 변환해야함
// double로 변환 없이 int 변수값으로만 나눌 경우 소수점 값이 사라짐
System.out.println(result7);
}
}
-> 숫자와 문자열의 혼합 연산식의 경우 결과값은 문자열로 나타남
-> 앞에 있는 값부터 순차적으로 계산하기 때문에 뒤에 숫자 형태의 피연산자가 나와도 모두 문자열로 취급함
-> 뒤에 있는 피연산자로 연산을 하고자 할 때는 연산식을 괄호 안에 집어넣기!
public class StringConcatExample {
public static void main(String[] args) {
int result1 = 10 + 2 + 8;
System.out.println(result1); // 20
String result2 = 10 + 2 + "8";
//문자열이 포함되어 있으므로 변수를 String 타입으로 지정해야함
System.out.println(result2);
// 128 : 8을 문자열로 지정했으므로 문자로 취급.
String result3 = 10 + "2" + 8;
//맨 앞부터 연산이 처리가 되기 때문에 앞에 문자열이 나오면 그 뒤로부터는 문자열 취급
System.out.println(result3); // 1028
String result4 = "10" + 2 + 8;
//맨 앞부터 연산이 처리가 되기 때문에 앞에 문자열이 나오면 그 뒤로부터는 문자열 취급
System.out.println(result4); // 1028
String result5 = "10" + (2+8);
//괄호 연산자가 있을 경우 괄호 연산자부터 처리됨
System.out.println(result5); // 1010
}
}