연산자(operator) → 연산을 수행하는 기호(+,-,*,/)등
피연산자(operand) → 연산자의 작업 대상(변수, 상수, 리터럴, 수식 등)
산술연산자
+,-,*,/,% 사칙연산과 나머지연산(%)을 산술연산이라고 칭합니다.
컴퓨터는 내부적으로 이진수 변환을 한 이후에 이진수를 토대로 자연수를 이해하기 떄문에 직접적인 비트연산인 경우 연산의 속도가 빨라집니다.
우선 10진수를 2진수로 변환하는 방법은 아래와 같습니다.
비트 연산자
연산자 |
설명 |
예 |
& |
논리곱(and) |
각 비트를 비교하여 양쪽 모두 1이면 1, 아니면 0을 반환 |
| | 논리합(or) | 각 비트를 비교하여 어느 한쪽이 1이면 1 아니면 0을 반환 |
^ | 베타적 논리합(xor) | 각 비트를 비교하여 한쪽이 1이고 다른 한쪽이 0이면 1을 아이면 0을 반환 |
~ | 1의 보수 표현(not) | 각 비트를 반전시킨 값을 반환 |
<< | 왼쪽 쉬프트 연산자 | 180<<2 , 180을 왼쪽으로 2비트만큼 이동 |
>> | 오른쪽 쉬프트 연산자 | 180>>2, 180을 오른쪽으로 2비트만큼 이동 |
위의 코드에서 i와 j로만 계산할 경우 자동으로 10진수로 변환하기때문에 Integer.toBinaryString()메서드를 이용해서 2진수를 출력할 수 있도록 합니다.
~i를 계산한 경우에 32자리로 나오게 되는데 이 이유는 java의 int가 32비트의 크기를 가지고 있기때문에 다른 연산에서는 앞자리가 0이라 생략되었지만 ~연산에서는 0이 1로 반전되면서 32자리가 모두 출력되게 됩니다.
관계 연산자
관계연산자는 비교연산자라고도 하며, 쉽게 설명하면 부등호입니다.
관계연산자의 결과는 true 또는 false의 값인 boolean 자료형으로 변환됩니다.
연산자 |
설명 |
예 |
> |
왼쪽이 크면 true 아니면 false를 반환 |
num > 5; |
< |
왼쪽이 작으면 true 아니면 false를 반환 |
num < 5; |
>= |
왼쪽항이 오른쪽보다 크거나 같으면 true |
num >=5; |
<= |
왼쪽항이 오른쪽보다 작거나 같으면 true |
num <= 5; |
== |
왼쪽항과 오른쪽항이 같으면 true, 아니면 false 반환 |
num ==5; |
!= |
왼쪽항과 오른쪽항이 다르면 true, 아니면 false 반환 |
num != 5; |
논리 연산자
논리연산자는 boolean 형의 값을 가질 수 있는 자료형에 대해서만 적용가능합니다.
OR연산자 | || | 피연산자 중 어느 한 쪽이 true이면 true이다. |
AND연산자 | && | 피연산자 중 양쪽 모두 true일 경우 true이다. |
논리부정연산자 | ! | 피연산자가 true이면 false, false이면 true를 반환한다. |
x |
y |
x||y |
X&&y |
true |
true |
true |
true |
true |
false |
true |
false |
false |
true |
true |
false |
false |
false |
false |
false |
instanceof
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용합니다.
instanceof의 사용형식은 객체 + instanceof + 클래스입니다.
또한 연산의 결과를 boolean값인 true와 false중의 하나를 반환합니다.
instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 의미합니다.
assignment(=) operator
대입연산자 또는 할당연산자라고 하며, 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장하고 그 저장된 값은 연산결과로 반환합니다.
대입연산자의 왼쪽 피연산자를 lvalue(left value)라고 하며, 오른쪽 피연산자를 rvalue(right value)라고 합니다.
대입연산자의 rvalue는 변수 뿐 아니라 식이나 상수등 모두 가능하지만, lvalue는 반드시 변수처럼 값을 변경할 수 있는것이어야합니다. 따라서 리터럴이나 상수처럼 값을 저장할 수 없는것들은 lvalue가 될 수 없습니다.
대입 연산자 | 설명 |
= | 왼쪽의 피연산자에 오른쪽의 피연산자를 대입함. |
+= | 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
-= | 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
*= | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
/= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
%= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함. |
화살표(->) 연산자 (Lambda)
java8로 부터 도입된 함수 지향적 표현 방식으로 병렬 처리와 이벤트 지향 프로그래밍에 적합합니다.
(코드의 간소화, 가독성 향상되지만 재사용이 불가하고 디버깅이 까다로워 짐)
java에서 Lambda를 사용하기 위한 조건 -> 단 한개의 추상메서드만 가지는 인터페이스가 필요합니다.
3항 연산자
3항연산자란 '조건식?식1:식2' 로 표현하며 조건식이 true이면 식1을 출력하고 false이면 식2를 출력하게 됩니다.
연산자 우선 순위
1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행이 됩니다.
2. 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높습니다.
3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 왼쪽에서 오른쪽 입니다.
종류 | 결합규칙 | 연산자 | 우선순위 |
단항 연산자 | <--------------------- | ++ -- + - ~ ! | 높음 낮음 |
산술 연산자 | ----------------------> | * / % | |
----------------------> | + - | ||
----------------------> | << >> | ||
비교 연산자 | ----------------------> | < > <== >== instanceof | |
----------------------> | == != | ||
논리 연산자 | ----------------------> | & | |
----------------------> | ^ | ||
----------------------> | | | ||
----------------------> | && | ||
----------------------> | || | ||
삼항 연산자 | ----------------------> | ?: | |
대입 연산자 | <--------------------- | = += -= *= /= %= <<= >>= &= ^= |= |
(optional) Java 13. switch 연산자
기존 switch문에서 사용되던 반환 키워드 break가 java13버전부터 yield로 변경되었습니다.
break를 이용한 값 반환 방법이 없어지고 그 대신 yield를 사용할 수 있도록 한 것 입니다.
<Reference>
자바의 정석 저자 남궁 성
www.w3schools.com/java/java_operators.asp
docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
'Challenge' 카테고리의 다른 글
6주차 과제: 상속 (0) | 2020.12.26 |
---|---|
5주차 과제: 클래스 (0) | 2020.12.19 |
4주차 과제: 제어문 (0) | 2020.12.03 |
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.21 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2020.11.20 |
댓글