ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 자바의 연산자
    Java/Java 기본 및 이론 2021. 1. 7. 15:43

    목표

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

    학습할 것

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

     

     

    •  

    산술 연산자

    • Binary Operator(이항)

      • +, -, *, /, %(Modulo)
      • ArithmeticException 발생 가능
        • Divide by zero
        • Modulo by zero 

    비트 연산자

    • Binary Operator(이항)
      • &(AND)
      • |(OR)
      • ^(XOR)
      • >> (right SHIFT)
      • << (left SHIFT)
      • >>> (unsigned right SHIFT) : 비트값을 오른쪽으로 이동한 이후 왼쪽 공간은 모두 0로 채움, C/C++ 에 없음
    • Unary Operator(단일항)
      • ~(NOT, 비트 패턴 반전)
    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;

    관계 연산자

    • Binary Operator(이항)
      • == : Equal to
      • != : Not equal to
      • > : greater than
      • < : less than
      • >= : greater than or equal to
      • <= : less than or equal to
    • primitive type 인 피연산자에서 연산 가능
    • 연산 결과 타입은 boolean

    논리 연산자

    • Binary Operator(이항)
      • && (LOGICAL AND)
      • || (LOGICAL OR)
    • 피연산자의 타입은 boolean
    • 연산 결과 타입은 boolean

    instanceof

    • Type introspection : 실행 시간에 객체의 타입이나 속성을 검사하는 프로그램의 능력을 뜻함

    • Java 에서 대표적인 type introspection

    • 객체의 타입을 비교할 때 사용

    • null 은 어떤 것의 instance 도 아님

    class Test {
      ...
    }
    
    class Test2 extends Test{
      ...
    }
    
    class Operator{
        public static void main(String[] args) {
            Test obj1 = new Test();
            Test obj2 = new Test2();
            System.out.println(obj1 instanceof Test);    // true
            System.out.println(obj1 instanceof Test2);   // false
            System.out.println(obj2 instanceof Test);    // true, 상속 관계이기 때문?
            System.out.println(obj2 instanceof Test2);   // true
            System.out.println(null instanceof Object);  // false
        }
    }

    Assignment(=) operator

    • Binary Operator(이항)
      • = (ASSIGN)
      • += (ADD and ASSIGN)
      • -= (SUBTRACT and ASSIGN)
      • *= (MULTIPLY and ASSIGN)
      • /= (DIVIDE and ASSIGN)
      • %= (MODULO and ASSIGN)
      • &= (AND and ASSIGN)
      • ^= (XOR and ASSIGN)
      • |= (OR and ASSIGN)
      • <<= (LEFT SHIFT and ASSIGN)
      • >>= (RIGHT SHIFT and ASSIGN)
      • >>>= (UNSIGNED RIGHT SHIFT and ASSIGN)
    • 객체에 값을 할당
    • 다른 연산자와 묶어서 사용 가능
    • declaration statement, assignment expression 에서 사용됨
    • Java 는 reference type 의 경우 주소값을 할당한다는것에 주의해야 함

    화살표(->) 연산자

    • 8 버전부터 람다 표현식(lambda expression) 이 공식적으로 적용되었음

    • 함수형 프로그래밍(Functional programming) 표현

      • side-effect 발생을 최소화 하기 위함
      • 조건
        • Pure function
        • Anonymous function
        • Higher-order function
      • Java 에서는 하나의 메소드가 선언된 인터페이스
    • 화살표 연산자는 Java 에서 람다 표현식의 syntax 일부

      (argument, ...) -> {expression}
    interface Test{
        int func(int a);
    }
    
    class Test2 {
        public void func(Test test){
            int value = test.func(3);
            System.out.println(value);
        }
    }
    
    class Operator{
        public static void main(String[] args) {
            Test2 test2 = new Test2();
    				// lambda expression 사용 X 버전
            test2.func(new Test() {
                public int func(int a){
                    return a + 2;
                }
            });
    				// lambda expression 사용 버전
            test2.func((a) ->{
                return a + 2;
            });
        }
    }

    3항 연산자

    • Conditional Operator

      • ?:

      • 구조

        Conditional Expression ? Expression(true인 경우) : Expression(false 인 경우);
    • 3항 연산자 사용 VS if-else 사용

      • 3항 연산자: expression
      • if-else: statement
      • 문법적인 의미로 보자면 3항 연산자는 expression 이므로 statement 내부 expression이 위치할 수 있는 모든 곳에서 사용 가능, expression 이므로 3항 연산자 자체를 중첩해서 사용 가능

     

    int a = 2;
    // if-else statement 사용
    if(a == 2){
    a += 1;
    }
    else{
    a += 2;
    }
    
    // 3항 연산 사용
    a == 2 ? a += 1 : a+=2 ;

    연산자 우선 순위

    기본적으로 연산자에는 우선순위가 있으며, 괄호의 우선순위가 제일 높고, 산술 > 비교 > 논리 > 대입의 순서이며, 단항 > 이항 > 삼항의 순서이다. 연산자의 연산 진행방향은 왼쪽에서 오른쪽으로 수행되며, 단항 연산자와 대입 연산자의 경우에는 오른쪽에서 왼쪽으로 수행된다. 

    OperatorsPrecedence

    postfix expr++ expr--
    unary ++expr --expr +expr -expr ~ !
    multiplicative * / %
    additive + -
    shift << >> >>>
    relational < > <= >= instanceof
    equality == !=
    bitwise AND &
    bitwise exclusive OR ^
    bitwise inclusive OR |
    logical AND &&
    logical OR ||
    ternary ? :
    assignment = += -= *= /= %= &= ^= |= <<= >>= >>>=

     

    Ref. https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

    • 동일 선상에 있는 연산자들은 동일한 우선 순위를 가짐
    • 할당 연산 제외한 Binary Operator 는 left ⇒ right 로 평가
    • 할당 연산은 right⇒ left 로 평가

    (optional) Java 13. switch 연산자

    switch(expression){
    	case expression -> expression;
    	...
    	default -> expression
    };
    
    switch(expression){
    	case expression:
    		expression;
    		yield expression;
    	...
    	default:
    		expression;
    		yield expression;
    };
    • 차이점

      • case : 말고도 case -> 사용 가능
        • 화살표인 경우 branch fall-through 가 아님
        • 중괄호로 감싸야 하는 경우
          • multiple statement 를 적용
          • throw statement 사용, expression이 아닌 경우
      • break statement 대신 yield statement 사용
    • oracle 문서에서는 arrow case 라벨을 사용하는 것을 권장함

      • 이유:
        • colon case 라벨을 사용하면 헷갈릴 수 있음
        • 헷갈리게 되면 의도하지 않은 fall through 가 발생할 수 있음

     

    반응형

    댓글

Designed by Tistory.