어떠한 기능을 수행하는 기호 (+, -, *, / 등)
연산자의 작업 대상(변수, 상수, 리터럴, 수식)
전위형 | j = ++i; | ++i; j=i; | 값이 참조되기 전에 증가시킨다. |
---|---|---|---|
후위형 | j = i++; | j = i; i++; | 값이 참조된 후에 증가시킨다. |
ex)
int i = 5;
int j = 0;
전위형 : j = ++i;
i값을 가지고 오기전에 1을 더하고 나서 대입을 한다.
결과 = int j -> 6
후위형 : j = i++;
i값 5를 대입하고 나서 i값은 1이 더해져서 6이 저장된다.
결과 = int j -> 5
1. 증감연산자는 독립적으로 사용될 때는 똑같이 값을 1증가 시킨다.
2. 수식에 포함되어있을 때만 달라진다.
이항연산자는 연산을 수행하기 전에 피연산자의 타입을 일치시킨다.
int보다 크기가 작은 타입은 int로 변환한다.( byte, char, short --> int )변수의 크기 링크
byte + short --> int + int --> int
char + int --> int + int --> int
ex) --------------------------------
byte a = 10;
byte b = 20;
byte c = a + b;
byte a + byte b--> int a + int b (자동 형변환)
byte c = int a + int b; <--- error가 난다. (계산된 값이 int인데 byte에 넣으려고 해서)
byte c = (byte)a + b; <--- 마찬가지로 한개만 byte로 변환시키면 int로 자동 변환되기 때문에 error가 생긴다.
byte c = (byte)(a + b); <--- OK!!
ex) --------------------------------
int a = 1000000; // 1,000,000
int b = 2000000; // 2,000,000
long c = a * b; // c 는 2,000,000,000,000 ?
c 는 -1454759936 Overflow !!
long c = (long)a * b; <--- 한개만 long으로 변환시키면 자동으로 나머지도 long으로 변환되서 계산 된다.
long a * int b -> long a * long b -> long <--- OK!!
long c = a * bL; <--- 대문자 L을 뒤에 붙여도 long으로 변환가능하다.
Math.round() : 소수점 첫째자리에서 반올림한 값을 반환
float pi = 3.141592f;
float shortPi = Math.round(pi * 1000) / 1000f;
Math.round(3.141592f * 1000) / 1000f;
Math.round(3141.592f) / 1000f;
3142 / 1000f; ---> 3142는 int지만 float로 자동 변환 되어서 계산됨
3142.0f / 1000f
3.142f
int share = 10 / 8; -- 몫
int remain = 10 % 8; -- 나머지
10 % 8 -> 2
10 % -8 -> 2
-10 % 8 -> -2
-10 % 8 -> -2
나눠지는 수의 왼쪽 수의 부호를 따른다.
x << n 은 x * 2의n승 과 같다.
x >> n 은 x / 2의n승 과 같다.
10.0d == 10.0f -> 10.0d == 10.0d -> true
0.1d == 0.1f -> 0.1d == 0.1d -> false
(float)0.1d == 0.1f -> 0.1f == 0.1f -> true
&&가 ||보다 우선순위가 높다. 같이 사용되는 경우 괄호를 사용하자
조건식의 연산결과가 true이면 식1의 결과를 반환하고 false이면 식2의 결과를 반환한다.
(조건식) ? 식1 : 식2
int x = -10;
int a = x >= 0 ? x : -x;