- 우선순위 : 단항 연산자 > 산술 연산자 > 비교 연산자 > 논리 연산자 > 삼항 연산자 > 대입 연산자
- 단항 > 이항 > 삼항
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽 -> 오른쪽
2. 단항 연산자
2.1 증감 연산자 ++ --
- boolean을 제외한 Primitive Type 변수에 사용 가능
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class OperatorEx2 { public static void main(String[] args) { int i = 5; int j = 0; j = i ++; System.out.println("j=i++; 실행 후 , i="+ i +", j=" + j); i = 5; j = 0; j = ++i; System.out.println("j=++i; 실행 후, i=" + i +", j="+ j); } } | cs |
결과
1 2 3 4 5 6 7 8 9 10 11 | public class OperatorEx3 { public static void main(String[] args) { int i = 5, j=5; System.out.println("i++ = " + i++); System.out.println("++j = " + ++j); System.out.println("i = "+ i + ", j = "+ j ); } } | cs |
2.2 부호연산자 + -
- 피연산자의 부호를 변경하는 데 사용, boolean 형, char 형을 제외한 나머지 기본형에 사용
- '+' 연산자는 양수 1을 곱한 결과
- '-' 연산자는 음수 1을 곱한 결과
2.3 비트전환 연산자 ~
- 정수형과 char형에만 사용
- 피연산자를 2진수로 표현 했을 때, 0은 1로, 1은 0으로 비트전환됨 (결과는 부호가 반대로 변경됨)
- ~피연산자의 연산결과는 int 타입이라, int 보다 작은 데이터형에 담으면 x
2.4 논리부정 연산자 !
- boolean 형에만 사용 가능
3. 산술 연산자
3.1 사칙 연산자
1 2 3 4 5 6 7 8 9 10 11 | public class OperatorEx8 { public static void main(String[] args) { byte a = 10; byte b = 20; // byte c = a + b; 에러 발생 ! + 연산자는 피연산자들의 자료형을 int 로 변환했음 int c = (byte) a + b; // 크기가 큰 자료형을 작은 자료형의 변수에 저장할 때 명시적 형변환 해야함 System.out.println(c); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 | public class OperatorEx10 { public static void main(String[] args) { int a = 1000000; int b = 2000000; long c = a * b; System.out.println(c); // c 는 20000000000000가 나오지않음 // * 연산자가 피연산자를 int 형으로 변환 후 연산한 값이 c에 들어감 } } |
1 2 3 4 5 6 7 8 9 10 | public class OperatorEx16 { public static void main(String[] args) { char lowerCase = 'a'; char upperCase = (char)(lowerCase - 32); System.out.println(upperCase); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class OperatorEx16 { public static void main(String[] args) { float pi = 3.141592f; float shortPi = (int)(pi * 1000) / 1000f; // 1) pi는 float, 1000은 정수형이므로 연산 결과는 float인 3141.592f // 2) 캐스트연산자의 형변환 수행. 결과는 3141 소수점 이하는 반올림없이 버려짐 // 3) 3141 / 1000f int와 float의 연산이므로 // int가 float이 되고 float와 float의 연산 수행 // 4) 3141.0f / 1000f => 3.141f System.out.println(shortPi); } } | cs |
3.2 나머지 연산자 %
- 왼쪽의 피연산자를 오른쪽의 피연산자와 나누고 난 나머지값을 돌려주는 연산자
1 2 3 4 5 6 7 8 9 10 | public class OperatorEx16 { public static void main(String[] args) { System.out.println(-10%8); // -2 System.out.println(10%-8); // 2 System.out.println(-10%-8); // -2 } } | cs |
-> 왼쪽 피연산자 (나눠지는 수)의 부호에 따라간다.
3.3 쉬프트 연산자 <<, >>, >>>
- 정수형 변수에만 사용
x << n 은 x * 2의 n승과 같다.
x >> n 은 x / 2의 n승과 같다.
- '<<' 연산자는 피연산자의 부호에 상관없이 자리를 왼쪽으로 이동시키며 빈칸을 0으로 채움
- '>>' 연산자는 오른쪽으로 이동시키기 때문에 음수인 경우 부호 유지를 위해 1로 빈칸을 채움
- '>>>' 연산자는 부호에 상관없이 항상 0으로 빈자리를 채움
- 숫자 n의 값이 자료형의 bit 수보다 크면 자료형의 bit수로 나눈 나머지만큼만 이동함
ex. int형의 경우 1000 >> 32 는 아무 것도 수행 x
1000 >> 35는 32를 나눈 나머지 3만큼만 이동하여 1000 >> 3을 수행함
- 나눗셈, 곱셈 연산자보다 속도가 빠르다 !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class OperatorEx16 { public static void main(String[] args) { int temp; System.out.println(-8); System.out.println(Integer.toBinaryString(-8)); System.out.println(); //-8을 2진수로 표현한 문자열 반환 // -8 // 11111111111111111111111111111000 temp = -8 << 1; System.out.println("-8 << 1 : "+ temp); System.out.println(Integer.toBinaryString(temp)); // -8 << 1 : -16 // 11111111111111111111111111110000 왼쪽으로 한칸밀리고 0으로 채움 temp = -8 >> 1; System.out.println("-8 >> 1 : "+ temp); System.out.println(Integer.toBinaryString(temp)); // -8 >> 1 : -4 // 11111111111111111111111111111100 오른쪽으로 한칸밀리고 1로 채움 } } | cs |
4. 비교 연산자
4.1 대소비교 연산자 - <, >, <=, >=
4.2 등가비교 연산자 - ==, !=
** 참조형 변수에 사용가능한 연산자는 ==, !=, 캐스트연산자 뿐 ( String만 + 사용 가능 )
문자열 비교에는 == 대신 equals() 를 사용함
정수형 10와 실수형 10.0f 는 같다.
double형 0.1 과 0.1f 는 다르다.
==> 정수형과 달리 실수형 float과 double은 근사값으로 저장되기 때문에 다르다.
10.0f를 double로 형변환하면 10.0을 얻지만, 0.1f를 double로 형변환하면 0.1이 아닌 0.10000000149011612를 얻는다.
So, 형변환을 통해 두 피연산자의 타입을 float으로 맞춰서 자동형변환이 안일어나게 하거나, 소수점 몇 째자리까지 동일하게 잘라서 비교해야함