
자바가 제공하는 다양한 연산자를 학습.
프로그램에서 데이터를 처리하여 결과를 산출하는 것
연산에 사용되는 표시나 기호
연산되는 데이터
연산자와 피연산자를 이용하여 연산의 과정을 기술한 것
| 산술 연산자 | 설명 |
|---|---|
| + | 두개의 값을 더한다. |
| - | 왼쪽 기준으 ㅣ값에서 오른쪽 값으로 뺀다. |
| * | 두개의 값을 곱한다. |
| / | 왼쪽 기준의 값에서 오른쪽 값으로 나눈다. |
| % | 왼쪽 기준의 값에서 오른쪽 값으로 나눈 후, 나머지를 가져온다. |
피연산자들의 타입이 동일하지 않을 경우 피연산자들의 타입을 일치시킨 후 연산을 수행한다.
public class NaN
{
public static void main(String[]args)
{
System.out.println(0.0 / 0.0); //zero divided by zero
System.out.println(Math.sqrt(-1)); //take sqrt of negative number
System.out.println(10.0 % 0); //taking mod by zero
}
}
비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자이다. 비트 단위로 왼쪽이나 오른쪽으로 전체 비트를 이동하거나, 1의 보수를 만들 때도 사용된다.
| 비트 연산자 | 설명 |
|---|---|
| & | 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산) |
| | | 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산) |
| ^ | 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산) |
| ~ | 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산, 1의 보수) |
| << | 명시된 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산) |
| >> | 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산) |
| >>> | 지정한 수만큼 비트를 전부 오른쪽으로 이동시키며, 새로운 비트는 전부 0이 됨. |
| 관계 연산자 | 설명 |
|---|---|
| a < b | a 가 b 보다 작은가? |
| a > b | a 가 b 보다 큰가? |
| a <= b | a 가 b 보다 작거나 같은가? |
| a >= b | a 가 b 보다 크거나 같은가? |
| a == b | a 와 b 가 같은가? |
| a != b | a 와 b 가 다른가? |
'A' == 65 // true, 'A' 가 int 타입으로 변환되어 65가 된 다음 65 == 65로 비교
3 == 3.0 // int 타입인 3을 double 타입으로 변환한 후 3.0 == 3.0 으로 비교
0.1 == 0.1f // false
(float) 0.1 == 0.1f
String strVar1 = "값1";
String strVar2 = "값1";
String strVar3 = new String("값1");
// 결과
strVar1 == strVar2 // true
strVar2 == strVar3 // false
strVar2.equals(strVar3) // true
| 논리 연산자 | 설명 |
|---|---|
| && | 논리식이 모두 참이면 참을 반환함. (논리 AND 연산) |
| || | 논리식 중에서 하나라도 참이면 참을 반환함. (논리 OR 연산) |
| ! | 논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환함. (논리 NOT 연산) |
instanceof 비교 연산자
ClassCastException발생| 대입 연산자 | 설명 |
|---|---|
| = | 왼쪽의 피연산자에 오른쪽의 피연산자를 대입함. |
| += | 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
| -= | 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
| *= | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
| /= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
| %= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함. |
| &= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
| |= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
| ^= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
| <<= | 왼쪽의 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
| >>= | 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호를 유지하며 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
| >>>= | 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
Java 1.8에 추가된 람다식에서 사용되는 연산자
매개변수를 이용하여 중괄호를 실행한다는 의미
Runnable r = new Runnable() {
@Override
public void run() {
System.out.print("Run method");
}
};
Runnable r = ()-> System.out.print("Run method");
조건식 ? 반환값1 : 반환값2
public String getGrade(int score) {
String grade = "";
switch (score) {
case score >= 90:
grade = "A";
break;
case score >= 80:
grade = "B";
break;
case score >= 70:
grade = "C";
break;
case score >= 60:
grade = "D";
break;
case score >= 50:
grade = "E";
break;
default:
grade = "F";
break;
}
}
break로 값을 반환하던 것이 yield를 이용하도록 변경private static int getValueViaYield(String mode) {
int result = switch (mode) {
case "a", "b":
yield 1;
case "c":
yield 2;
case "d", "e", "f":
// do something here...
System.out.println("Supports multi line block!");
yield 3;
default:
yield -1;
};
return result;
}
public static void main(String[] args) {
int start = 2_000_000_000;
int end = 2_100_000_000;
int mid = (start + end) / 2; // 오버플로우 발생의 가능성이 있음
int mid = start + (end - start) / 2;
int mid = (start + end) >>> 1;
}