기본적으로 더하기, 빼기, 곱하기, 나누기, 나머지 연산자 등이 존재한다.
숫자를 더하거나, 문자를 연결시킬 수 있는 연산자이다.
숫자를 뺄 수 있는 연산자이다.
숫자를 곱할 수 있는 연산자이다.
숫자를 나눌 수 있는 연산자이다.
0으로 나누게 되면 ArithmeticException이 발생한다.
숫자를 나누고 남은 나머지를 나타내는 연산자이다.
각 비트 연산을 정확히 이해하기 위해서는, 컴퓨터의 경우 맨왼쪽의 비트가 1일 경우에 이를 음수로 인식하여 2의 보수 작업을 진행한다는 것을 알고 있어야 한다.
2의 보수 작업이란, 간단히 1의 보수 작업을 진행한뒤 1을 더해주는 것을 말한다.
여기서 1의 보수 작업이란 비트를 반전시키는 것과 같은 작업이다.
예를들어 1001에 대해서 살펴보자
가장 왼쪽의 비트가 1이기때문에 이는 음수이다.
음수이기때문에, 2의 보수 작업을 진행해보자.
1의 보수 : 0110
2의 보수 : 1의 보수에 1을 더한 것 : 0111
결과적으로 이는 -7인 것이다.
각 비트를 1이면 0으로, 0이면 1로 변환시켜준다.
위의 결과를 자세히 살펴보면 다음과 같다.
2를 비트로 표현하면, 양의 정수이므로 010이다.
010에 대한 not 연산자를 적용하면, 101이다.
101은 가장 왼쪽의 비트가 1이기 때문에 숫자는 음수이다.
음수이기때문에, 2의 보수의 작업을 진행해보자.
1의 보수 : 010
2의 보수 : 011
결과적으로 이는 -3이다.
두 개의 비트가 모두 1일때만 1을 리턴하고, 아니면 0을 리턴한다.
두 비트중 하나라도 1이면 1을 리턴하고, 둘다 0일때 0을 리턴한다.
두 비트가 다를때 1을 리턴하고, 같으면 0을 리턴한다.
해당 수만큼 왼쪽으로 비트 전체를 이동 시킨다.
결과적으로만 보면, 2를 곱하는 연산과 같다고 볼 수 있다.
해당 수만큼 오른쪽으로 비트 전체를 이동 시킨다.
양수인 경우에는, 가장 왼쪽 비트가 0으로 채워진다.
음수인 경우에는, 가장 왼쪽 비트가 1로 채워진다.
결과적으로만 보면, 2로 나누는 연산과 같다고 볼 수 있다.
음수 양수 관계없이, 왼쪽 비트를 0으로 채운다.
== : 값이 같다면 true, 아니면 false
!= : 값이 다르면 true, 같으면 false
모두 true일때 true이고, 하나라도 false라면 false이다.
하나라도 true라면 true이다.
객체 또는 배열의 값이 어떠한 유형인지 알려주는 연산자이다.
Primitive Type은 피비교의 대상이 될 수 없다.
피비교의 대상이 되는 것 instanceof 비교의 기준이 되는 것
interface Ex_interface {}
class Example_class1 implements Ex_interface {}
class Example_class2 {}
public class study {
public static void main(String[] args) {
Example_class1 ex1 = new Example_class1();
Example_class2 ex2 = new Example_class2();
System.out.println("Example_class1 instanceof Ex_interface : " + (ex1 instanceof Ex_interface)); // true
System.out.println("Example_class2 instanceof Ex_interface : " + (ex2 instanceof Ex_interface)); // false
}
}
할당 연산자라고 부른다.
해당 할당 연산자를 기준으로, 오른쪽의 피연산자를 왼쪽의 피연산자로 할당한다.
int ex_variable = 10; // 10
람다가 도입되면서 사용되기 시작한 연산자이다.
짧게 글로 설명하자면, 화살표 왼쪽에는 메소드에서 사용할 매게변수를 괄호() 안에 나열한다.
그리고 화살표 오른쪽에는 해당 매개변수를 활용하여 처리하는 코드 부분을 작성한다.
interface Test {
int test_function(int a);
}
public class study {
public static void main(String[] args) {
Test test = (a) -> {
return a+1;
};
System.out.println(test.test_function(2)); // 3
}
}
기본적인 구조는 다음과 같다.
<조건> ? <if 조건이 참> : <if 조건이 거짓일 때>
다음의 두 코드는 같은 동작을 한다.
public class study {
public static void main(String[] args) {
int num1 = 6;
if(num1 > 5) num1 *= 2;
else num1 /= 2;
System.out.println(num1);
int num2 = 6;
System.out.println(num2 > 5 ? (num2 *= 2) : (num2 /=2));
}
}
연산자의 우선순위는 위와 같다.
이러한 연산자의 우선순위가 헷갈린다면, 자신이 의도하는 연산자의 우선순위에 따라 괄호()를 활용하는 편이 좋다