반응형

목표

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

학습할 것

  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • 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 가 발생할 수 있음

 

반응형

+ Recent posts