본문 바로가기

🌈 Java/Back to Basic 101

3주차 과제: 연산자

목표

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

학습할 것

산술 연산자 사칙 연산 ( + , - , / , * , %)
비트 연산자 1 과 0 으로 참과 거짓의 결과 표현 
관계 연산자 양쪽의 값이 어떤 관계를 갖는지 확인 
논리 연산자 대상이 boolean 타입인 논리 값
instanceof (래퍼런스 타입 변수) instanceof (레퍼런스 데이터 타입)
assignment(=) operator 값을 초기화 하여 할당 
화살표 -> 연산자 람다 표현식 
3항 연산자 (조건) ? (조건이 참일 경우 실행) : (조건이 거짓일때 실행)
연산자 우선순위 (1) 괄호 (2) !, ~, ++, -- (3) *, /, %  (4) +, - (5) <<, >>, >>>  ...
switch 연산자 if-else 과 같은 역할 / 13부터 value return 혹은 yield 추가 

 

🌟 산술 연산자

: 덧셈, 뺄셈, 곱셈, 나눗셈 사칙 연산 ( +, -, *, /, % )

 - boolean 을 제외한 모든 Primitive Type 에서 사용이 가능합니다. 

 ** 산술 연산을 할 때는 타입에 따른 결과를 주의해야합니다. 

     타입 캐스팅 -> 원본 데이터의 데이터 타입 표현 범위를 모두 표현하지 못하는 데이터 타입으로 만들어진 변수에 값을 넣을 때 

     타입 프로모션 -> 원본 데이터의 데이터 타입 표현 범위를 모두 표현할 수 있는 데이터 타입으로 만들어진 변수에 값을 넣을 때 

     ex. 1.5 * 2.0 + (5.5 / 2) + 5 / 4  -> 6.75

 

🌟비트 연산자

    : 1과 0 으로 이루어진 연산. / 0 = false & 1 = true 

~ 단항 연산자를 부정  (NOT)
& 이항 연산자를 양쪽 항의 값이 모든 1인 경우 1 반환 (AND)
| 이항 연산자로 양쪽 중 하나라도 1이면 1 반환 (OR)
^ 이항 연산자로 양쪽 한의 값이 서로 다를때 1 반환 (XOR, Exclusive or)
NOT (~)
입력 결과
1 0
0 1
& (AND) | (OR) ^(XOR)
입력1 입력2 결과 입력1 입력2 결과 입력1 입력2 결과
1 1 1 1 1 1 1 1 0
1 0 0 1 0 1 1 0 1
0 1 0 0 1 1 0 1 1
0 0 0 0 0 0 0 0 0

       

a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)

Bitwise OR Operation of 5 and 7
  0101
| 0111
 ________
  0111  = 7 (In decimal)
  
  a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)

Bitwise AND Operation of 5 and 7
  0101
& 0111
 ________
  0101  = 5 (In decimal) 
  
a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)

Bitwise XOR Operation of 5 and 7
  0101
^ 0111
 ________
  0010  = 2 (In decimal) 

 

🌟 관계 연산자

     : 연산자를 중심으로 양쪽의 값이 어떤 관계를 가지는지 확인하는 연산자 

       - 종류 : 

관계 연산자 종류

🌟 논리 연산자

       : 비트 연산과 비슷하지만 대상(피연산자)이 boolean 타입의 논리 연산자인 경우이다. 

         - 종류 : ! , &&, ||

// flag = false 일때 
while(!flag) {
   .....
}

if(score < 90 && score >= 80) {
   System.out.println("grade = B");
}

if (x < -1 || x > 5) {
	System.out.println("범위는 -1보다 작거나 5보다 크다");
}

 

🌟 instanceof

      : 객체 또는 배열 값을 어떠한 참조 유형에 맞는 값인지 평가하는 연산자;  null 을 평가하면 항상 false

       - (래퍼런스 타입변수) instanceof (레퍼런스 데이터 타입) - 래퍼런스 타입 변수가 래퍼런스 타입의 데이터 타입인지 확인하는 연산 

public static void main(String[] args)
    {
        Child cobj = new Child();
  
        // A simple case
        if (cobj instanceof Child)
           System.out.println("cobj is instance of Child");
        else
           System.out.println("cobj is NOT instance of Child");
          
    }
    
   // cobj is instance of Child

** 일반적으로 Java 프로그래머 사이에서 instanceof를 사용하지 않는 것이 좋습니다. 종종 의심스러운 설계의 신호일 수 있습니다. 정상적인 상황이라면 instanceof의 사용을 피할 수 있지만 필요한 경우도 있긴 합니다.

 

🌟 assignment(=) operator

       : 대입 또는 할당 연산자; 오른쪽의 피연산자를 왼쪽의 피연산자의 값으로 할당한다. 

           - 왼쪽에는 변수가 오른쪽에는 리터럴 또는 리터럴이 담긴 변수 배치 (값을 초기화) 

           - 종류 : =, +=, -=, *=, /=, %=, &=, ^=, |=

                       <<=, >>=, >>>=   -- ex.  >>=  : a = a >> b;와 같은 의미

      

🌟 시프트 (shift) 연산자

       : 비트 이동 연산자 

         => left_operand  op  n

연산자 사용법  
<< op1 << op2 op1 의 비트를 왼쪽으로 op2반큼 움직인다. 
>> op1 >> op2 op1 의 비트를 오른쪽으로 op2 만큼 움직인다. 
>>> op1 >>> op2 op1 의 비트를 오른쪽으로 2비트 시프트 
  • >> 의 경우에는 부족한 값을 오른쪽으로 이동할때 MSB 값으로 채우고 
  •  >>> 의 경우에는 부족한 값을 무조건 0으로 채운다.      

🌟 화살표(->) 연산자

      : 람다 연산자 (Java 8) 아주 간단하고 유용하다. 

 

      >> 아래 예제들 모두 알고리즘 문제에 자주 나옴으로 기억해 두는 것이 좋습니다!!

Comparator<Developer> byName = new Comparator<Developer>() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getName().compareTo(o2.getName());
        }
};

// 람다로 변환 
 Comparator<Developer> byName = 
        (Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
        
        
//sort by age
    Collections.sort(listDevs, new Comparator<Developer>() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getAge() - o2.getAge();
        }
    });
    
//lambda
    listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());

🌟 3항 연산자

      : 3개의 항을 가진 연산자. 물음표와 콜론을 사용하여 사용합니다. 

      -> (조건) ? (조건이 참일 경우 실행) : (조건이 거짓일때 실행)

int cnt = counts.compute(nums[i], (k,v) -> v == null ? 1 : v+1);

// 이것을 풀어서 쓸 경우는 
if(counts.containsKey(nums[i])) {
        counts.put(nums[i], counts.get(nums[i]) + 1);
} else {
        counts.put(nums[i], 1);
}
      

 

🌟 연산자 우선 순위

 

우선순위를 외우는 것이 힘들다면

괄호를 이용하자 ... 😊

 

 

 

 

 

 

 

 

 

 

 

 

🌟 Java 13. switch 연산자

      : 가독성을 포함해 실행 속도를 향상 시키기 위해 있는 문법 

        -  java 13 에서는 switch 는 statement 가 아니고 operator (expression) 입니다

                 * 연산자란? 데이터를 처리하여 결과를 산출하기 위해 사용되는 표시나 기호  

 

       - 5개 이하의 케이스일 경우에는 if-else 이용해도 상관없지만 조건문이 많아질 경우에는 속도면에서는 switch가 더 빠른 결정이다. 

          그러므로 성능 향상을 중요하게 생각한다면 yes!

          자세한 설명은 -> if vs. switch 작동법에 대한 정리 (parks38.tistory.com/14

// Java 13, switch expression returns a value via yield
    private static int getValueViaYield(String mode) {
        int result = switch (mode) {
            case "a", "b":
                yield 1;
            case "c":
                yield 2;
            case "d", "e", "f":
                // do something here...
                System.out.println("Supports multi line block!");
                yield 3;
            default:
                yield -1;
        };
        return result;
    }


// Traditional switch
    private static int getValueBefore12(String mode) {
        int result;
        switch (mode) {
            case "a":
            case "b":
                result = 1;
                break;
            case "c":
                result = 2;
                break;
            case "d":
            case "e":
            case "f":
                result = 3;
                break;
            default:
                result = -1;
        }
        ;
        return result;
    }