사칙 연산자, 산술 변환
사칙 연산자
class Ex3_6 {
public static void main(String args[]) {
int a = 10;
int b = 4;
System.out.printf("%d + %d = %dn", a, b, a + b); // 14
System.out.printf("%d - %d = %dn", a, b, a - b); // 6
System.out.printf("%d * %d = %dn", a, b, a * b); // 40
System.out.printf("%d / %d = %dn", a, b, a / b); // 10 / 4 = 2
System.out.printf("%d / %d = %fn", a, (float)b, a + (float)b); // 10 / 4.000000 = 2.500000
}
}
사칙 연산은 같은 타입끼리만 가능하다. 다른 타입끼리 연산을 할 경우 피연산자 중 하나를 선택해서 형변환을 해야 한다. (둘다 해도 되지만 번거롭다.)
산술 변환
위의 언급 한 것 같이 타입이 다르면 형변환으로 일치 시킨다.
일일이 일치시키는 것이 번거롭기 때문에 자동 형변환을 제공하는 데 이를 산술 변환이라고 한다.
이러한 산술 변환에는 2가지 규칙이 있다. (중요!)
1) 두 피 연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)
long (8byte) + int (4byte) ---> long (8byte) + long (8byte)
float (4byte) + int (4byte) ---> float (4byte) + float(4byte) : 실수가 정수보다 표현 값이 크다.
double (8byte) + float (4byte) ---> double (8byte) + double (8byte)
2) 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
* int 보다 작은 타입 : byte, char, short
byte (1byte) + short (2byte) ---> int (4byte) + int (4byte) = int (4byte)
char (2byte) + short (2byte) ---> int (4byte) + int (4byte) = int (4byte)
* int로 연산되는 이유?
byte는 -128 ~ 127까지 , char는 0 ~ 60000 , short는 -30000 ~ 30000까지로 굉장히 범위가 작다. 범위가 넘어가면 오버 플로우가 발생하여 정확한 계산이 되지 않는다. 이를 막기 위해서 일단 큰 타입인 int로 바꿔 놓고 계산 해주는 것이다. 이렇게 해야 오버 플로우가 일어나지 않는다.
char num1 = '2';
char num2 = '0';
// 각각 int로 형변환 되고 문자 코드표에 의해서
num1 - num2 // int 2 결과 반환 -> 문자 2는 숫자코드로 50 , 문자 0은 숫자코드로 48
* 앞서 공부 할 때 , 문자를 숫자로 형변환 하는 과정에서 문자형 ' 0 ' 을 빼주었는데
그 이유는 문자 0이 숫자 코드로 48이고 1부터 순차적으로 문자 ' 1 ' = 49, 문자 ' 2 ' = 50 , 문자 ' 3 ' = 51 ... 이런 식으로 구성되어 있기 때문에 위의 num1 - num2가 int 2 를 반환하는 것이다.
[ 자바의 정석 - 기초 유튜브 강의 영상 참고 ]
https://www.youtube.com/watch?v=gz0jjUBITtw&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=27