package operator;
public class Ex2 {
public static void main(String[] args) {
/*
* 산술 연산에서의 자동 형 변환
*
*/
byte b1 = 10, b2 = 3;
// byte b3 = b1 + b2; // 에러 발생!
// => b1과 b2 모두 byte 타입이므로 연산 전 int 타입으로 자동 변환됨
// 따라서, 연산 결과가 int 타입이 되어 byte 타입에 저장 불가능
// byte b3 = (byte) b1 + (byte) b2; // 주의! 잘못된 문법
// => 최종적으로 연산 시점에서 다시 int로 변환 후 연산 수행함!
// 연산 결과(int)를 다시 byte 타입으로 변환해야한다!
byte b3 = (byte) (b1 + b2);
System.out.println(b3);
short s1 = 10;
// short s2 = b1 + s1; // byte + short = int + int = int
short s2 = (short) (b1 + s1); // int -> short으로 강제형변환
System.out.println(s2);
// int 이상의 타입이 피연산자로 있을 경우
// => 둘 중 큰 타입으로 변환 후 연산을 진행
char ch1 = 'A';
// char ch2 = ch1 + 3; // char + int = int + int = int
char ch2 = (char) (ch1 + 3); // int -> char 로 강제형변환
System.out.println(ch2);
int i1 = 100;
long l1 = 200;
// int i2 = i1 + l1; // int + long = long + long = long
int i2 = (int) (i1 + l1); // long -> int로 강제형변환
System.out.println(i2);
float f1 = 1.0f;
// long l2 = l1 + f1; // lont + float = float + float = float
long l2 = (long) (l1 + f1);
System.out.println(l2);
System.out.println(10 / 3); // int / int = int
// 나눗셈 연산자는 몫만 계산하지만
// 정수 연산에서 연산 결과와
// 실수가 포함된 나눗셈 연산 결과가 달라짐
System.out.println(10 / 3.0); // int / double = double / double = double
// => 10 / 3과 달리 3.0은 double 타입이므로
// 실수 나눗셈을 수행하여 소수점 자리까지 계산됨
System.out.println(10 / (double) 3); // 위의 연산과 동일하지만
// 일반적으로 정수 -> 실수 변환하여 표현 시 .0을 붙여서 표기
// byte 타입 변수에 int형 리터럴 간의 연산 결과를 저장할 때
// 연산 결과를 최종적으로 변수에 할당하므로 별도의 형변환 필요 없음
byte b4 = 10 + 10;
// byte b4 = 20; 코드를 실행한 결과와 같다. 따라서 오류 X
System.out.println(b4);
// byte b5 = 10 + 120; // 오류 발생
// 연산 결과가 byte 범위를 벗어나므로 int형으로 취급되어
// byte 타입 변수에 저장 불가능 => 이 때는 강제 형변환 필요!
}
}