이항 연산자는 피연산자가 2개인 연산자를 말한다.
산술 연산자의 특징은 피연산자들의 타입이 동일하지 않을 경우 다음과 같은 규칙을 사용해서 피연산자들의 타입을 일치시킨 후 연산을 수행한다는 점이다. long 타입을 제외한 정수 타입 연산은 int 타입으로 산출되고, 피연산자 중 하나라도 실수 타입이면 실수 타입으로 산출된다.
1. long타입을 제외한 정수 타입(byte
, short
, char
)일 경우 모두 int 타입으로 변환된 후에 연산을 수행
한다. char 또한 정수타입으로 산술 연산시 유니코드로 변환되어 계산된다.
// byte 예시
byte byte1 = 1;
byte byte2 = 1;
byte byte3 = byte1 + byte2; // 컴파일 에러
int byte3 = byte1 + byte2; // 올바른 예시
// char 예시
char c1 = 'A' + 1; // chart c1 = 66; >>> 리터럴 간의 연산은 컴파일 단계에서 수행하기 때문에 타입 변환이 없어 아무런 문제가 되지 않음
char c2 = 'A'
char c3 = c2 + 1; //chart 변수가 산술 연산에 사용되면 int 타입으로 변환되므로 컴파일 에러 발생
int c3 = c2 + 1; // 올바른 예시: int타입으로 지정
chart c3 = (char) (c2 + 1) // 올바른 예시: 강제 타입 변환
2. 피연산자들이 모두 정수 타입이고 long 타입이 포함되어 있을 경우, 모두 long 타입으로 변환된 후 연산을 수행 한다.
int + long
➡️ long + long
= long
3. 피연산자 중 실수 타입(float, double)이 있을 경우, 허용 범위가 큰 실수 타입으로 변환된 후 연산을 수행한다.
// 예시)
int int1 = 10;
int int2 = 4;
int result2 = int1 / int2; // 결과: 2 - (1번 예제)
double result3 = int1 / int2; // 결과: 2.0 - (2번 예제)
// 소수점자리의 값까지 얻고 싶을 경우
double result3 = (int1 + 1.0) / int2; // 결과: 2.5 >> 실수 타입으로 만든 후 산술 연산
double result3 = (double) int1 / int2; // 결과: 2.5 >> 강제 타입 변환
double result3 = int1 / (double) int2; // 결과: 2.5 >> 강제 타입 변환
Java에서는 (1번 예제)
int
를int로 나눈 연산 결과
는 소수점 이하 부분을 버리고정수부분만 산출
된다.
또한 (2번 예제)int
를int로 나눈 연산 결과
값을double타입으로 지정
해주어도 double타입 변수에 대입하는 것이므로실수화를 할 뿐
소수점까지 나눠진 값이 나오진 않는다.
만약, 나눈 값의 소수점까지를 결과로 얻고 싶다면 피연산자 중 최소 하나는 실수 타입이여야 한다!
Ref.
책: 혼자 공부하는 자바