목표
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
산술 연산자
비트 연산자
관계 연산자
논리 연산자
instanceof
assignment(=) operator
화살표(->) 연산자
3항 연산자
연산자 우선 순위
(optional) Java 13. switch 연산자
마감일시
2020년 11월 28일 오후 3시까지
산술 연산자
정의
사칙연산을 다루는 연산자이며 모두 두 개의 피연산자를 가지는 이항 연산자이고, 결합 방향은 왼쪽 -> 오른쪽이다.
종류
+ 왼쪽의 피연산자에 오른쪽의 피연산자를 더함.
- 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌
* 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함.
/ 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔.
% 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 반환함.
예제
int number1 = 12, number = 3;
System.out.println("+ 연산자에 의한 결과 : "+ (num1 + num2));
실행결과 : 15
System.out.println("- 연산자에 의한 결과 : "+ (num1 - num2));
실행결과 : 9
System.out.println("* 연산자에 의한 결과 : "+ (num1 * num2));
실행결과 : 36
System.out.println("/ 연산자에 의한 결과 : "+ (num1 / num2));
실행결과 : 4
System.out.println("% 연산자에 의한 결과 : "+ (num1 % num2));
실행결과 : 0
비트 연산자
정의
비트(bit) 단위로 논리 연산을 할때 사용하는 연산
비트(bit) 단위로 왼쪽이나 오른쪽으로 전체 비트를 이동하거나, 1의 보수를 만들 때도 사용
종류
& 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
| 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산, 1의 보수)
<< 명시된 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산)
>> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)
>>> 지정한 수만큼 비트를 전부 오른쪽으로 이동시키며, 새로운 비트는 전부 0이 됨.
비트 연산자 동작 나열
비트 AND 연산
대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환
비트 OR 연산
대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환
비트 XOR 연산
대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환
비트 NOT 연산
해당 비트가 1이면 0을 반환하고, 0이면 1을 반환
예제코드
int num1 = 8, num2 = -8;
System.out.println("~ 연산자에 의한 결과 : "+ ~num1);
// 실행결과 : -9
해설
- 비트 반전 연산자(~)는 피연산자의 1의 보수를 반환하므로, 피연산자의 부호만 반대로 변경
System.out.println("<< 연산자에 의한 결과 : "+ (num1 << 2));
// 실행결과 : 32
해설
System.out.println(">> 연산자에 의한 결과 : "+ (num2 >> 2));
// 실행결과 : -2
해설
System.out.println(">>> 연산자에 의한 결과 : "+ (num1 >>> 2));
// 실행결과 : 2
해설
System.out.println(">>> 연산자에 의한 결과 : "+ (num2 >>> 2));
// 실행결과 : 1073741822
해설
관계 연산자
정의
피연산자 사이의 상대적인 크기를 판단하는 연산자
왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, 어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단
모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽
종류
== 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 참을 반환함.
!= 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참을 반환함.
> 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 참을 반환함.
>= 왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 참을 반환함.
< 왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 참을 반환함.
<= 왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 참을 반환함.
예제코드
char ch1 = 'a', ch2 = 'A';
System.out.println("== 연산자에 의한 결과 : "+ (ch1 == ch2));
// 실행결과 : false
System.out.println("> 연산자에 의한 결과 : "+ (ch1 > ch2));
// 실행결과 : true
논리 연산자
정의
주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자입니다.AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽
NOT 연산자는 피연산자가 단 하나뿐인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽
종류
&& 논리식이 모두 참이면 참을 반환함. (논리 AND 연산)
|| 논리식 중에서 하나라도 참이면 참을 반환함. (논리 OR 연산)
! 논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환함. (논리 NOT 연산)
예제코드
char ch1 = 'b', ch2 = 'B';
boolean result1, result2
result1 = (ch1 > 'a') && (ch1 < 'z');
result2 = (ch2 < 'A') || (ch2 < 'Z');
System.out.println("&& 연산자에 의한 결과 : "+ result1);
// 실행결과 : true
System.out.println("|| 연산자에 의한 결과 : "+ result2);
// 실행결과 : true
System.out.println("! 연산자에 의한 결과 : "+ !result2);
// 실행결과 : false
논리연산자 모든 동작에 대한 진리표
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
모든 연산자 우선순위
순위
1)
[] 첨자 연산자 왼쪽 -> 오른쪽
. 멤버 연산자 왼쪽 -> 오른쪽
2)
++ 후위 증가 연산자 왼쪽 -> 오른쪽
-- 후위 감소 연산자 왼쪽 -> 오른쪽
3)
! 논리 NOT 연산자 오른쪽 -> 왼쪽
~ 비트 NOT 연산자 오른쪽 -> 왼쪽
+ 양의 부호 (단항 연산자) 오른쪽 -> 왼쪽
- 음의 부호 (단항 연산자) 오른쪽 -> 왼쪽
++ 전위 증가 연산자 오른쪽 -> 왼쪽
-- 전위 감소 연산자 오른쪽 -> 왼쪽
(타입) 타입 캐스트 연산자 오른쪽 -> 왼쪽
4)
* 곱셈 연산자 왼쪽 -> 오른쪽
/ 나눗셈 연산자 왼쪽 -> 오른쪽
% 나머지 연산자 왼쪽 -> 오른쪽
5)
+ 덧셈 연산자 (이항 연산자) 왼쪽 -> 오른쪽
- 뺄셈 연산자 (이항 연산자) 왼왼쪽 -> 오른쪽
6)
<< 비트 왼쪽 시프트 연산자 왼쪽 -> 오른쪽
>> 부호 비트를 확장하면서 비트 오른쪽 시프트 왼쪽 -> 오른쪽
>>> 부호 비트까지 모두 비트 오른쪽 시프트 왼쪽 -> 오른쪽
7)
< 관계 연산자(보다 작은) 왼쪽 -> 오른쪽
<= 관계 연산자(보다 작거나 같은) 왼쪽 -> 오른쪽
>= 관계 연산자(보다 큰) 왼쪽 -> 오른쪽
= 관계 연산자(보다 크거나 같은) 왼쪽 -> 오른쪽
instanceof 인스턴스의 실제 타입 반환 왼쪽 -> 오른쪽
8)
== 관계 연산자(와 같은) 왼쪽 -> 오른쪽
!= 관계 연산자(와 같지 않은) 왼쪽 -> 오른쪽
9)
& 비트 AND 연산자 왼쪽 -> 오른쪽
10)
^ 비트 XOR 연산자 왼쪽 -> 오른쪽
11)
| 비트 OR 연산자 왼쪽 -> 오른쪽
12)
&& 논리 AND 연산자 왼쪽 -> 오른쪽
13)
|| 논리 OR 연산자 왼쪽 -> 오른쪽
14)
? : 삼항 조건 연산자 왼쪽 -> 오른쪽
15)
= 대입 연산자 및 복합 대입 연산자
(=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=)
화살표(->) 연산자
정의
람다 표현식으로, 메소드를 하나의 식으로 표현한 것
메소드의 매개변수로 전달 및 결과 값으로 반호나
사용이유
기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높여 줌.
표현식
(x, y) -> x < y ? x : y;
유의사항
1) 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있음.
2) 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있음.
3) 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있음. (이때 세미콜론(;)은 붙이지 않음)
4) 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없음.
5) return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됨. (이때 세미콜론(;)은 붙이지 않음)
예제코드
new Thread(new Runnable()
{
public void run()
{
System.out.println("전통적인 방식의 일회용 스레드 생성");
}
}).start();
// 실행결과
// > 전통 방식의 일회용 스레드 생성
new Thread(() -> {
System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
}).start();
// 실행결과
// > 람다 방식의 일회용 스레드 생성
3항 연산자
정의
피연산자를 세 개나 가지는 조건 연산자
문법
조건식 ? 반환값1 : 반환값2
물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, 결괏값이 거짓(false)이면 반환값2를 반환
예제코드
int num1 = 5, num2 = 7;
int result;
result = (num1 - num2 > 0) ? num1 : num2;
System.out.println("두 정수 중 더 큰 수는 " + result + "입니다.");
// 실행결과
// > 두 정수 중 더 큰 수는 7입니다.
instanceof
정의
참조 변수가 참조하고 있는 인스턴스의 실제 타입을 반환해 줍니다. 즉, 해당 객체가 어떤 클래스나 인터페이스로부터 생성되었는지를 판별해 주는 역할을 함
문법
인스턴스이름 instanceof 클래스또는인터페이스이름
왼쪽 피연산자인 인스턴스가 오른쪽 피연산자인 클래스나 인터페이스로부터 생성되었으면 true를 반환하고, 그렇지 않으면 false를 반환 함.
예제코드
class A {}
class B extends A {}
public static void main(String[] args)
{
A a = new A();
B b = new B();
System.out.println(a instanceof A); // true
System.out.println(b instanceof A); // true
System.out.println(a instanceof B); // false
System.out.println(b instanceof B); // true
}
assignment(=) operator
정의
대입 연산자라고 하며 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽임.
복합 대입 연산자 종류
= 왼쪽의 피연산자에 오른쪽의 피연산자를 대입함.
+= 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
-= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
*= 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
/= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
%= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함.
&= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
|= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
^= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
<<= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
>>= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호를 유지하며 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
>>>= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
예제코드
int num1 = 7, num2 = 7, num3 = 7;
num1 = num1 - 3;
num2 -= 3;
num3 =- 3;
System.out.println("- 연산자에 의한 결과 : "+ num1);
// 실행결과 : 4
System.out.println("-= 연산자에 의한 결과 : "+ num2);
// 실행결과 : 4
System.out.println("=- 연산자에 의한 결과 : "+ num3);
// 실행결과 : -3
(optional) Java 13. switch 연산자
추가 된 내용
yield (yielding a value) 키워드 추가
switch가 표현식이 가능하게 되면서 반환 값 처리에 대해 명시를 위해 제공되는 기능 즉, "case L ->" 의 오른쪽 표현식이 블록으로 처리되는 경우 반환하는 값이 어떤 것인지 지정을 할 수 있게 됨.
예제코드
int j = switch (day)
{
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k); yield result;
}
};
출처
Java 13. switc 내용 출처 : https://luvstudy.tistory.com/90
연산자 내용 image 출처 : TCP