본문 바로가기

STUDY REVIEW/STUDY HALLE

3주차 과제: 연산자

목표

자바가 제공하는 다양한 연산자를 학습하세요.

학습할 것

  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • instanceof
  • assignment(=) operator
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선 순위
  • (optional) Java 13. switch 연산자

1. 산술 연산자

연산자 설명 피연산자 수 결과값
+ 이항 숫자
- 이항 숫자
* 이항 숫자
/ 나눈 몫 이항 숫자
% 나눈 나머지 이항 숫자

 

2. 비트 연산자

연산자 설명 피연산자 수 결과값 입력 결과
& AND 이항 숫자, boolean 1
1
0
0
1
0
1
0
1
0
0
0
| OR 이항 숫자, boolean 1
1
0
0
1
0
1
0
1
1
1
0
^ XOR 이항 숫자, boolean 1
1
0
0
1
0
1
0
0
1
1
0
~ NOT 단항 숫자, boolean 1
0

0
1
int a = 3 & 1;  // 0011 & 0001 = 1
int b = 2 | 1;  // 0010 | 0001 = 3
int c = 3 ^ 1;  // 0011 ^ 0001 = 2
int d = b >> 1; // 0011 에서 왼쪽으로 1칸 이동, 1(0001)
int e = b << 1; // 0011 에서 오른쪽으로 1칸 이동, 6(0110)
int f = ~a;     // 0001 -> 1111 1111 1111 1111 1111 1111 1111 1110
// 1000 0000 0000 0000 0000 0000 0000 0000
// ->
// 0100 0000 0000 0000 0000 0000 0000 0000
int g = -2147483648 >>> 1;
https://www.notion.so/3-f3a94e0092664d8aa1debe7e88dec43b

 

3. 관계 연산자

연산자 설명 피연산자 수 결과값
== 양쪽 값이 같으면 참, 다르면 거짓(같음) 이항 boolean
!= 양쪽 값이 다르면 참, 같으면 거짓(같지않음)  이항 boolean
> 왼쪽 값이 크면 참, 같거나 작으면 거짓(큼) 이항 boolean
>= 왼쪽 값이 크거나 같으면 참, 작으면 거짓(크거나 같음) 이항 boolean
< 왼쪽 값이 작으면 참, 같거나 크면 거짓(작음) 이항 boolean
<= 왼쪽 값이 작거나 같으면 참, 크면 거짓(작거나 같음) 이항 boolean

 

4. 논리 연산자

연산자 설명 결과값
! 부정 boolean
&& AND boolean
|| OR boolean

 

5. instanceof

- 객체가 특정 클래스에 속하는지 아닌지를 확인.

- 객체타입을 비교할때 사용.

- 상속 관계도 확인.

obj instanceof Class

//#obj가 Class에 속하거나 Class를 상속받는 클래스에 속하면 true 반환.
class Rabbit {}
let rabbit = new Rabbit();
alert( rabbit instanceof Rabbit ); // true

// 클래스가 아닌 생성자 함수에도 사용 가능
function Rabbit() {}
alert( new Rabbit() instanceof Rabbit ); // true

// 내장 클래스 활용
let arr = [1, 2, 3];
alert( arr instanceof Array ); // true
alert( arr instanceof Object ); // true
https://ko.javascript.info/instanceof 

 

6. assignment(=) operator(대입 OR 할당 연산자)

연산자 설명
= 왼쪽의 피연산자에 오른쪽의 피연산자를 대입
+= 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입
-= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입.
*= 왼쪽의 피연산자에서 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입
/= 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입
%= 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 후, 그 값의 나머지를 왼쪽의 피연산자에 대입
&= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입
|= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입
^= 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입
<<= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입
>>= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호를 유지하며 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입
>>>= 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입
tcpschool.com/java/java_operator_assignment

 

7. 화살표(->) 연산자

- 람다표현식 (매개변수목록) -> { 함수몸체 }

new Thread(new Runnable() {
    public void run() {
        System.out.println("전통적인 방식의 일회용 스레드 생성");
    }
}).start();

new Thread(()->{
    System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
}).start();

* 유의사항 

1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.

2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있다.

3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있다. (이때 세미콜론(;)은 붙이지 않음)

4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없다.

5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 된다. (이때 세미콜론(;)은 붙이지 않음)

www.tcpschool.com/java/java_lambda_concept

 

8. 3항 연산자

//(조건식)? 참 : 거짓;
int i = (1 < 2) ? 10 : 20;

//(조건식) ? 참 : (조건식) ? 참 : 거짓 
int a = 1;
int b = 10;
System.out.println((a > b) ? "a는 b보다 크다" : (a < b) ? "b는 a보다 크다" : "a와 b는 같다.");​

 

9. 연산자 우선 순위

우선순위 연산자 설명
1 () {} 괄호 / 대괄호
2 ! ~ ++ -- 부정 / 증감 연산자
3 * / % 곱 / 나누기 / 나머지
4 + - 덧셈 / 뺄셈
5 << >> >>> 비트단위의 쉬프트 연산자
6 < <= > >= 관계 연산자
7 == !=  
8 & 비트단위의 논리연산자
9 ^  
10 |  
11 && 논리곱 연산자
12 || 논리합 연산자
13 ?: 조건 연산자
14 = += -= *= /= %= <<= >>= &= ^= ~= 대입 / 할당 연산자

 

10. (optional) Java 13. switch 연산자

- 쉼표(,), 화살표(->), yield 키워드 사용 가능

	// 쉽표와 화살표를 이용하여 여러 case 나열 가능
    private static void switchJava12Basic(){
      Day day = Day.WEDNESDAY;    
      System.out.println(
          switch (day) {
              case MONDAY, FRIDAY, SUNDAY -> 6;
              case TUESDAY                -> 7;
              case THURSDAY, SATURDAY     -> 8;
              case WEDNESDAY              -> 9;
              default -> throw new IllegalStateException("Invalid day: " + day);
          }
      );  
    }
    
    // 쉽표와 화살표를 이용하여 여러 case 나열 가능
    private static void switchJava12(){
      int numLetters = 0;
      Day day = Day.WEDNESDAY;
      switch (day) {
          case MONDAY, FRIDAY, SUNDAY -> numLetters = 6;
          case TUESDAY                -> numLetters = 7;
          case THURSDAY, SATURDAY     -> numLetters = 8;
          case WEDNESDAY              -> numLetters = 9;
          default -> throw new IllegalStateException("Invalid day: " + day);
      };
      System.out.println(numLetters)
    }
    
    // yield 키워드를 사용해 switch 결과 반환
    private static void switchJava13Basic(){
      Day day = Day.WEDNESDAY;
      int numLetters = switch (day) {
          case MONDAY:
          case FRIDAY:
          case SUNDAY:
              System.out.println(6);
              yield 6;
          case TUESDAY:
              System.out.println(7);
              yield 7;
          case THURSDAY:
          case SATURDAY:
              System.out.println(8);
              yield 8;
          case WEDNESDAY:
              System.out.println(9);
              yield 9;
          default:
              throw new IllegalStateException("Invalid day: " + day);
      };
      System.out.println(numLetters);
    }
    
    // {} 블록을 사용해 추가 로직을 수행할 수 있다.
    private static void switchJava13(){
      int numLetters = switch (day) {
          case MONDAY, FRIDAY, SUNDAY -> {
              System.out.println(6);
              yield 6;
          }
          case TUESDAY -> {
              System.out.println(7);
              yield 7;
          }
          case THURSDAY, SATURDAY -> {
              System.out.println(8);
              yield 8;
          }
          case WEDNESDAY -> {
              System.out.println(9);
              yield 9;
          }
          default -> {
              throw new IllegalStateException("Invalid day: " + day);
          }
      }
    };