자바가 제공하는 다양한 연산자를 학습.
프로그램에서 데이터를 처리하여 결과를 산출하는 것
연산에 사용되는 표시나 기호
연산되는 데이터
연산자와 피연산자를 이용하여 연산의 과정을 기술한 것
산술 연산자 | 설명 |
---|---|
+ | 두개의 값을 더한다. |
- | 왼쪽 기준으 ㅣ값에서 오른쪽 값으로 뺀다. |
* | 두개의 값을 곱한다. |
/ | 왼쪽 기준의 값에서 오른쪽 값으로 나눈다. |
% | 왼쪽 기준의 값에서 오른쪽 값으로 나눈 후, 나머지를 가져온다. |
피연산자들의 타입이 동일하지 않을 경우 피연산자들의 타입을 일치시킨 후 연산을 수행한다.
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;
}