목표
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- (optional) Java 13. switch 연산자
#산술 연산자
| 연산 | 연산자 | 수식 | 결과 |
| 덧셈 | + | A + B | A와 B를 더한값 |
| 뺄셈 | - | A - B | A에서 B를 뺸 값 |
| 곱셈 | x | A x B | A와 B를 곱한 값 |
| 나눗셈 | / | A / B | A ÷ B의 몫 |
| 나머지 | % | A % B | A ÷ B의 나머지 |
피연산자들의 타입이 동일하지 않을경우, 자동 타입 변환하여 피연산자들의 타입을 일치시킨 후 연산 수행
-피연산자가 모두 정수 타입
1. int타입보다 크기가 작은 정수 타입(byte, char, short)인 경우
→모두 int타입으로 변환 후 연산 수행 ex) byte + int → int + int = int
2.int타입보다 크기가 큰 정수타입(long)인 경우
→모두 long 타입으로 변환 후 연산 수행 ex) int + long → long + long = long
-피연산자 중 실수 타입(float, double) 존재
→크기가 큰 실수 타입으로 변환 후 연산 수행 ex) int + double → double + double = doouble
-char 타입
정수 타입이므로 산술 연산(아스키코드값을 이용한)가능
산술 연산시 int 타입으로 변환
변수 자체에 산술 적용시 int타입으로 산출되므로 컴파일 에러 발생, 강제 타입 변환(캐스팅)필요

#비트 연산자
비트 연산자는 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자
비트는 바이트보다 더 작은 단위이며 2진수를 저장, 0과 1로 표현이 가능한 정수 타입만 비트 연산이 가능
| 비트 연산자 | 설명 |
| & | 대응되는 비트가 모두 1이면 1을 반환(비트 AND연산) |
| | | 대응되는 비트 중에서 하나라도 1이면 1을 반환(비트 OR연산) |
| ^ | 대응되는 비트가 서로 다르면 1을 반환(비트 XOR연산) |
| ~ | 비트를 1이면 0으로, 0이면 1로 반전(비트 NOT연산) |
| <<,>> | 부호를 유지하면서 지정한 수만큼 비트를 전부 왼쪽, 오른쪽으로 이동시킴(left / right shift 연산) |
기능에 따라 비트 논리 연산자(&, |, ^, ~), 비트 이동 연산자(<<, >>)로 구분
비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용
-비트 AND 연산 : 두 항이 모두 1일 때 결과 값이 1
-비트 OR 연산 : 둘 중 하나라도 1이면 결과 값이 1
-비트 XOR 연산 : 두 항 값이 다르면 결과 값이 1
-비트 NOT 연산 : 이 전 항 값의 반대값 출력

#관계 연산자
비교 연산자라고도 하며 우리가 수학시간에 배웠던 부등호를 생각하면 된다
관계 연산자의 결과는 true / false 값인 boolean 자료형으로 반환이 된다제어문에서 많이 사용되는 연산자
| 연산자 | 기능 |
| a < b | a가 b보다 작은가? |
| a > b | a가 b보다 큰가? |
| a <= b | a가 b보다 작거나 같은가? |
| a >= b | a가 b보다 크거나 같은가 |
| a == b | a와 b가 같은가? |
| a != b | a와 b가 다른가? |
#논리 연산자
논리 연산자는 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자AND연산과 OR연산은 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다NOT연산자는 피연산자가 단 하나뿐인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽이다
| 논리 연산자 | 설명 |
| && | 논리식이 모두 참이면 참을 반환 (논리 AND연산) |
| || | 논리식 중에서 하나라도 참이면 참을 반환 (논리 OR 연산) |
| ! | 논리식의 결과가 참이면 거짓, 거짓이면 참 반환(논리 NOT 연산) |
↓ 논리 연산자의 모든 동작의 결과를 보여주는 진리표(truth table)
| A | B | A && B | A || B | !A |
| true | true | true | true | false |
| true | false | false | true | false |
| false | true | false | true | true |
| false | false | false | false | true |
#instanceof
instanceof란?
참조변수가 참조하고 있는 인스턴스의 실제객체 타입을 확인하는 연산자
형변환 가능 여부를 확인하며 true / false 로 결과를 반환
어떤 타입에 대한 instanceof 연산의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 뜻한다
instanceof의 기본 사용방법은 "객체 instanceof 클래스"를 선언함으로써 사용
주로 상속 관계에서 부모 객체인지 자식 객체인지 확인하는데 사용
값이 null인 참조변수에 대해 instanceof 연산을 수행하면 false를 결과로 얻는다
1. parent instanceof Parent : 부모가 본인집을 찾았으니 true
2. child instanceof Parent : 자식이 상속받은 부모집을 찾았으니 true (상속을 받았으니 자기집이라해도 무방하다?)
3. parent instanceof Child : 부모가 자식집을 찾았으니 false (자식집은 자식집이지 부모집은 아니니까)
4. child instanceof Child : 자식이 본인집을 찾았으니 true
모든 클래스는 Object를 상속하기 때문에 Object에 대한 instanceof는 항상 true를 반환
#assignment(=) operator 대입연산자
대입 연산자(assignment operator)
대입연산자는 변수에 값을 대입할 때 사용하는 이항연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다
| 대입연산자 | 설명 |
| = | 왼쪽의 피연산자에 오른쪽 피연산자를 대입 |
복합 대입 연산자
복합 대입 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다
| 복합 대입 연산자 | 설명 |
| += | 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 왼쪽의 피연산자에 대입 |
| -= | 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 왼쪽의 피연산자에 대입 |
| *= | 왼쪽의 피연산자에서 오른쪽의 피연산자를 곱한 후, 왼쪽의 피연산자에 대입 |
| /= | 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 후, 왼쪽의 피연산자에 대입 |
| %= | 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입 |
| .= | 왼쪽의 피연산자의 문자열에 오른쪽 피연산자의 문자열을 추가한 후, 왼쪽의 피연산자에 대입 |
| <<= | 왼쪽의 피연산자의 비트를 오른쪽의 피연산자 만큼 전부 왼쪽으로 이동시킨 후, 그 결과를 왼쪽 피연산자에 대입 |
| >>= | 왼쪽의 피연산자의 비트를 부호를 유지하면서 오른쪽의 피연산자 만큼 전부 오른쪽으로 이동시킨 후, 그 결과를 왼쪽의 피연산자에 대입 |
| &= | 왼쪽의 피연산자와 오른쪽 피연산자의 논리식이 모두 true면 왼쪽 피연산자에 true를 대입 나머지 false |
| 복합 대입 연산자 | 설명 |
| |= | 왼쪽의 피연산자나 오른쪽 피연산자의 논리식 중 하나라도 true면 왼쪽 피연산자에 true를 대입 나머지 fasle |
| ^= | 왼쪽의 피연산자의 논리식과 오른쪽 피연산자의 논리식이 서로 다르면 왼쪽 피연산자에 true를 대입 나머지 false |
#화살표(->) 연산자
자바 8부터 람다식(Lambda Expressions)을 지원하면서 람다식의 기본 문법으로 사용되는 연산자
람다표현식은 일종의 익명 함수라고 볼 수 있는데, 익명 함수를 이해하기 위해서는
먼저 익명 클래스 Anonymous class의 개념을 이해해야한다.
#3항 연산자
3항연산자 : 3개의 피연산자를 필요로 하는 연산자

true / false를 판단할 수 있는 변수 또는 조건식을 작성한후 '?'다음에는 연산결과인
True 또는 false에 실행 되는 표현식을 각각 작성하면 된다.
조건식의 결과가 true일 경우 피연산자2가 출력되고 false일 경우 피연산자3이 출력된다.
이 때 반환값에는 값 뿐 만 아니라 수식, 함수 호출 등 여러가지 형태의 명령문이 올 수 있다.
삼항연산자 사용시 주의사항
삼항연산자를 사용 시 코드를 좀 더 간결하게 작성할 수 있는 장점을 가지고 있다.
하지만 코드가 짧다고 해서 if문에 비해서 속도가 빠르지는 않다.
또한 축약된 형식이기 때문에 잘못 사용할 경우에는 소스코드의 가독성을 해치기도 한다.
특히 한 줄에 조건식과 결과 값들이 모두 모여있으므로 줄 단위 디버깅을 할 때 상당이 불편하다.
따라서 가독성을 해치지 않으면서 코드가 간결해지는 경우에만 삼항 연산자를 써야한다.
대부분의 경우에는 if조건문을 사용하여 여러줄로 작성하는 것이 좋다.
#연산자 우선 순위
| 우선 순위 | 연산자 | 내용 |
| 1 | (),[] | 괄호, 대괄호 |
| 2 | !,~,++.-- | 부정, 증감연산자 |
| 3 | *, /, % | 곱셈, 나눗셈 연산 |
| 4 | +, - | 덧셈, 뺄셈 연산 |
| 5 | <<, >>, >>> | 비트 단위 시프트 연산자 |
| 6 | <, <=, >, >=` | 관계 연산자 |
| 7 | ==, != | |
| 8 | & | 비트단위의 논리연산 |
| 9 | |, ^ |
| 우선 순위 | 연산자 | 내용 |
| 10 | && | 논리곱 |
| 11 | || | 논리합 |
| 12 | ?: | 조건부 연산자 |
| 13 | =, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, ~= |
대입 할당 연산자 |
#(optional) Java 13. switch 연산자
기존 자바에도 switch는 조건문으로 존재지만
그와 별개의 존재로 Java12부터 switch 연산자가 추가 되었다.
[switch 조건문]
-다수의 case, break가 존재하게 된다
-break; 를 빼먹을 경우 다음 분기로 넘기게 됨
-return 값이 존재할 수 없다

[switch 연산자]
-break를 사용하지 않아도 된다
-yield가 존재함, return값 존재 가능
-case ->A같은 형식으로 표현 가능
switch의 반환값이 따로 필요하지 않거나 case가 switch들어오는 모든 인자를 커버하는 경우
default 항목을 넣어주지 않아도 되나 그렇지 않은 경우는 default -> code를 작성해야 한다.
[Java12]
1. ->(화살표) 표현이 가능하고 data만 존재할 경우 return이 가능하다
2. ->구문을 사용할 경우 break;를 적지 않아도 다음 case 구문으로 넘어가지 않는다
3. ->표현 오른쪽은 꼭 단일 수행일 필요는 없다. 블록{} 안에서의 작업도 가능하다

[Java13]
1. yield 예약어가 추가됨. yield x하게 되면 x가 리턴됨
2. yield는 예약어이지만 변수명으로 사용가능하다. ex) int yield = 3;

'Back-end > Java_T.I.L' 카테고리의 다른 글
| 5. 클래스 (2) | 2022.01.02 |
|---|---|
| 4. 제어문_반복문(for, while, do-while) (0) | 2021.12.31 |
| 4. 제어문_선택문(if, else-if, switch) (0) | 2021.12.31 |
| 2. 자바 데이터 타입, 변수 그리고 배열 (0) | 2021.12.29 |
| 1. JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2021.12.28 |
댓글