♨학습내용
☞ 산술 연산자
☞ 비트 연산자
☞ 관계 연산자
☞ 논리 연산자
☞ instanceof
☞ assignment(=) operator
☞ 화살표(->)연산자
☞ 3항 연산자
☞ 연산자 우선 순위
☞ (optional) Java 13, switch 연산자
- 산술 연산자
- 수학적인 계산에 사용되는 연산자로 + , - , * , / , % 연산자가 있다.
- 숫자 피연산자 (byte, short, char, int, long, float, double)를 연산하며 결과도 숫자를 반환한다.
- int 타입보다 크기가 작은 타입들은 int로 프로모션 되어 연산된다.
- double → float → long → int 순으로 더 큰 타입이 있으면 프로모션 되어 연산된다.
<산술 연산자>
연산자 | 설명 |
+ | 더하기 (Addition) |
- | 빼기 (Subtraction) |
* | 곱하기 (Multiplication) |
/ | 나누기 (Division) |
% | 나머지 (Modulo) |
- + 연산자
- 기본적으로 두 수를 더하는 연산이지만 문자열을 연결시키는데도 사용할 수 있다.
- - 연산자
- 첫 번째 피연산자에서 두 번째 피연산자를 빼는 연산자이다.
- * 연산자
- 첫 번째 피연산자와 두 번째 피연산자를 곱하는 연산자이다.
- / 연산자
- 첫 번째 피연산자를 두 번째 피연산자로 나누는 연산자이다.
- % 연산자
- 첫 번째 피연사자를 두 번째 피연산자로 나누고 남은 나머지를 정수로 리턴한다.
- 비트 연산자
- & , | , ~ , ^ , << , >> , >>> 연산자가 있다.
- 비트 연산자는 정수 혹은 부울(boolean) 피연산자를 연산한다.
- 비트 단위로 연산하며 결과값은 정수 혹은 부울값을 반환한다.
<비트 이동 연산자 (쉬프트 연산자)>
연산자 | 설명 | 예 |
& | 논리곱(AND) | 각 비트를 비교하여 양쪽 모두 1이면 1, 아니면 0을 반환 |
| | 논리합(OR) | 각 비트를 비교하여 어느 한쪽이 1이면 1 아니면 0을 반환 |
^ | 베타적 논리합(XOR) | 각 비트를 비교하여 한쪽이 1이고 다른 한쪽이 0이면 1을, 아니면 0을 반환 |
~ | 1의 보수 표현(NOT) | 각 비트를 반전시킨 값을 반환 |
<< | 왼쪽 쉬프트 연산자 | 18<<2 , 18을 왼쪽으로 2비트만큼 이동 |
>> | 오른쪽 쉬프트 연산자 | 18>>2, 18을 오른쪽으로 2비트만큼 이동 |
- & 연산자
- 비트 AND 연산이나 논리 AND 연산을 한다. 정수와 부울 피연산자를 연산한다.
- 비트 AND 연산 : 대응하는 비트가 모두 1이면 1을 반환하고, 다른 경우는 0을 반환한다.
- 논리 AND 연산 : 논리식이 모두 참이면 참을 반환한다.
- | 연산자
- 두 정수 피연산자를 OR 연산한다.
- 단항 연산자. 정수로 표현할 수 있는 피연산자를 연산한다.
- ~ 연산자
- 비트의 NOT 연산을 한다.
- 1이면 0, 0이면 1로 반전시킨다. 정수 값으로 ~a의 결과는 (-a) - 1과 같다.
- ^ 연산자
- 비트 XOR 연산이나 논리 XOR 연산을 한다. 정수와 부울 피연산자를 연산한다.
- 비트 XOR 연산 : 대응되는 비트가 다르면 1을 반환하고 같으면 0을 반환한다.
- 논리 XOR 연산 : 논리식이 같으면 거짓을 반환하고 다르면 참을 반환한다.
- << 연산자
- 연산자는 비트를 왼쪽으로 두 번째 피연산자로 제시된 비트 수 만큼 이동 시킨다.
- 시프트 될 때 기존의 가장 왼쪽 비트는 삭제되고 가장 오른쪽 비트는 0으로 채워진다.
- >> 연산자
- 연산자는 왼쪽 시프트 연산과 반대로 오른쪽으로 두 번째 피연산자로 제시된 비트 수 만큼 이동 시킨다.
- 가장 오른쪽 비트는 삭제되고, 기존의 값이 양수인 경우, 가장 왼쪽 비트는 0으로 채워지고, 음수인 경우는 1이 채워진다.
- >>> 연산자
- 기본적으로는 오른쪽 시프트 연산과 동일하지만 부호에 관계없이 왼쪽 비트는 무조건 0으로만 채워진다.
- 그렇기 때문에 음수에 >>> 연산을 한다면 결과는 양수가 된다.
- 관계 연산자
- > , < , >= , <= , == , != 연산자가 있다.
- 관계연산자는 비교연산자라고도 하며, 쉽게 말하자면 부등호이다.
- 관계연산자의 결과는 true 또는 false의 값인 boolean 자료형으로 변환된다.
<관계 연산자>
연산자 | 설명 | 예 | |
> | 왼쪽이 크면 true 또는 false를 반환 | num > 34; | |
< | 왼쪽이 작으면 true 아니면 false를 반환 | num < 34; | |
>= | 왼쪽항이 오른쪽보다 크거나 같으면 true 아니면 false를 반환 | num >= 34; | |
<= | 왼쪽항이 오른족보다 작거나 같으면 true 아니면 false를 반환 | num <= 34; | |
== | 왼쪽항과 오른쪽항이 같으면 true 아니면 false 반환 |
num == 34; | |
!= | 왼쪽항과 오른쪽항이 다르면 true 아니면 false 반환 |
num != 34; |
- 논리 연산자
- 논리 연산자는 boolean 형의 값 (true, false) 을 가질 수 있는 자료형에 대해서만 적용 가능하다.
<논리 연산자>
AND연산자 | && | 피연산자 중 양쪽 모두 true일 경우 true이다. |
OR연산자 | || | 피연산자 중 어느 한 쪽이 true이면 true이다. |
부정연산자 | ! | 피연산자가 true이면 false, false이면 true를 반환한다. |
<논리연산자 반환값>
x | y | x&&y | x||y |
true | true | true | true |
true | false | false | true |
false | true | false | true |
false | false | false | false |
//논리 AND 연산을 한다.
boolean b = true && false; //false 출력
//논리 OR 연산을 한다.
boolean c = true || false; //true 출력
//단항 연산자. 논리 NOT 연산을 한다.
boolean a = !true; //false 출력
- instanceof
- 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용한다.
- 주로 조건문에 사용하고, instanceof의 왼쪽에는 참조변수를, 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.
- 연산의 결과로 boolean값인 true, false 중의 하나를 반환한다.
- 주로 상속 관계에서 부모객체인지 자식객체인지 확인하는데 사용한다.
class ATest{
}
class BTest extends ATest{
}
public class InstanceofExam {
public static void main(String[] args) {
ATest a = new ATest();
BTest b = new BTest();
//객체 a는 자기 자신의 객체이기 때문에 형변환 가능.
System.out.println(a instanceof A); //true 출력
//객체 b는 A의 자식객체이기 때문에 A로 형변환 가능.
System.out.println(b instanceof A); //true 출력
//객체 a는 B의 부모객체이기때문에 형변환 불가능.
System.out.println(a instanceof B); //false 출력
//객체 b는 자기 자신의 객체이기때문에 형변환 가능.
System.out.println(b instanceof B); //true 출력
}
}
- assignment(=) operator
- 대입 연산자 또는 할당 연산자라고 하며, 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장하고 그 값은 연산결과로 반환한다.
- 대입 연산자의 왼쪽 피연산자를 lavlue (left value) 라고 하고, 오른쪽 피연산자를 rvalue (right value) 라고 한다.
- '='은 항상 오른쪽에 위치해야한다.
<대입 연산자>
대입 연산자 | 설명 |
= | 왼쪽의 피연산자에 오른쪽의 피연산자를 대입한다. |
+= | 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입한다. |
-= | 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입한다. |
*= | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입한다. |
/= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입한다. |
%= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입한다. |
- 화살표(->)연산자
- 람다표현식. 메소드를 하나의 식으로 표현한 것이다.
- java에서 람다를 사용하기 위한 조건은 단 한개의 추상메서드만 가지는 인터페이스가 필요하다.
- 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스라고 한다.
- 자바에서 람다 표현식은 익명 클래스와 같다고 볼 수 있다.
참고) 익명 클래스는 Inner class로, 이름이 없는 클래스를 말한다. 클래스 정의와 동시에 객체를 생성할 수 있다.
- 3항 연산자
int a = ( 5 < 3 ) ? 50 : 40;
// (조건문) ? 참일때 : 거짓일때
- if/else 문과 비슷하지만 간단한 분기문을 처리하는데 특화되어 있는 연산자이다.
- if/else로 처리했을 때 보다 라인수를 훨씬 줄여준다.
- 다만, 삼항연산자를 사용하여 코드의 라인이 줄어들었다고 컴파일 속도가 빨라지는것은 아니다.
- 삼항연산자를 중복해서 사용하는 것은 가독성이 떨어질 수 있으므로 가급적 사용하지 않는 것이 좋다.
- 연산자 우선 순위
- 단항, 이항, 삼항 연산자 순으로 우선순위를 갖는다.
- 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 갖는다.
- 단항과 대입 연산자를 제외한 모든 연산 방향은 왼쪽에서 오른쪽이다.
- 복잡한 연산식에는 ( ) 괄호를 사용해서 우선순위를 정해준다.
- 연산자 우선순위가 같으면, 연산 방향에 따라 달라진다.
<연산자 우선순위>
우선순위 | 연산자 | 피연산자 | 연산 방향 | |
0 | ( ) 괄호 속 연산자 | 다양 | - | |
1 | 증감(++,--), 부호(+,-), 비트(~), 논리( | ) | 단항 | ← | |
2 | 산술 ( * , / , % ) | 이항 | → | |
3 | 산술 ( + , - ) | 이항 | → | |
4 | 쉬프트 ( << , >> , >>> ) | 이항 | → | |
5 | 비교 ( < , > , <= , >= , intanceof ) | 이항 | → | |
6 | 비교 ( == , != ) | 이항 | → | |
7 | 논리 & | 이항(단항) | → | |
8 | 논리 ^ | 이항(단항) | → | |
9 | 논리 | | 이항(단항) | → | |
10 | 논리 && | 이항 | → | |
11 | 논리 | | 이항 | → | |
12 | 조건 ( ? , : ) | 삼항 | → | |
13 | 대입 연산자들 | 이항 | ← |
- (optional) Java 13, switch 연산자
- Java 12 버전에서는 콜론(:) 대신 화살표(->) 연산자를 사용할 수 있다.
- Java 13 버전에서는 break 대신 yield를 사용한다.
// 기존의 switch 문
String result;
switch (input) {
case 1:
result = "a";
break;
case 2:
result = "b";
break;
case 3:
result = "c";
break;
case 4, 5:
result = "f";
break;
default:
result = "z";
}
// 변경된 switch 문
result = switch (input) {
case 1:
yield "a";
case 2:
yield "b";
case 3:
yield "c";
case 4, 5:
yield "f";
default:
yield "z";
}
// 화살표 연산자 이용하여 더욱 간략하게
result = switch (input) {
case 1 -> "a";
case 2 -> "b";
case 3 -> "c";
case 4, 5 -> "f";
default -> "z";
};
- 콜론을 사용했을 경우, yield가 빠지면 런타임 에러가 발생하고,
- 화살표 연산자를 사용했을 경우, yield가 빠지면 컴파일 에러가 발생한다.
'Study > Java_study' 카테고리의 다른 글
Java_study_6 (상속) (0) | 2021.08.09 |
---|---|
Java_study_5 (클래스) (0) | 2021.08.04 |
Java_study_4 (제어문) (0) | 2021.08.01 |
Java_study_2 (자바 데이터 타입, 변수 그리고 배열) (0) | 2021.07.26 |
Java_study_1 (JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가) (0) | 2021.07.18 |