1. 산술 변환(usual arithmetic conversion)
이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하기에, 피연산자의 타입이 서로 다르면 연산 전에 형 변환 연산자로 타입을 일치시켜야 한다. 이를 '산술 변환(usual arithmetic conversion)'이라고 한다.
산술 변환(usual arithmetic conversion) : 두 피연산자의 타입 중 더 큰 타입으로 일치시키는 것
int i = 10;
float f = 20.0f;
float result = f + (float)i; // 형변환으로 두 피연산자의 타입을 일치
float result = f + i; // 산술변환으로 형변환 연산자 생략 가능
2. 산술 변환의 규칙
1. 두 피연산자의 타입을 일치시킨다.(보다 큰 타입으로 일치)
long + int → long + long → long
float + int → float + float → float
double + float → double + double → double
2. 피연산자의 타입이 int보다 작은 타입이면 int로 변환한다.
byte + short → int + int → int
char + short → int + int → int
첫 번째 규칙은 피연산자의 값 손실을 최소화하기 위한 것이고, 두 번째 규칙은 int보다 작은 타입인 byte, char, short의 표현 범위가 좁아서 연산중에 오버플로우(overflow)가 발생할 가능성이 높기에 만들어졌다.
연산결과의 타입은 피연산자의 타입과 일치
int a = 5, b = 2;
System.out.println(a / b); // 연산결과는 int 타입이기에 결과는 2.5가 아닌 2
System.out.println(a / (float)b); // 산술변환으로 인해 float 타입이 되었기에 결과는 2.5f
참고문헌 : 남궁성(2016), Java의 정석, 도우출판