자바 연산자

Jeongmin Yeo (Ethan)·2020년 11월 25일
3

STUDY HALLE

목록 보기
3/13
post-thumbnail

자바가 제공하는 다양한 연산자를 정리합니다.

백기선님과 함께하는 자바 3주차 스터디 과정입니다.

학습할 내용은 다음과 같습니다.

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

Reference: Java in a Nutshell


1. 산술 연산자

연산자(Operator)란

Operator는 모든 프로그래밍 언어의 기본 구성 요소를 구성합니다. Java 역시 논리, 산술, 관계 등 다양한 계산과 함수를 수행할 필요성에 따라 사용할 수 있는 많은 유형의 연산자를 제공합니다.

Arithmetic Operators

산술 연산자는 피연산자라 불리는 원시 데이터 유형에 대해 다양한 산술 연산을 수행하는 데 사용할 수 있는 수학적 연산자를 포함합니다.

종류는 다음과 같습니다.

  • +(Addition)
  • *(multiplication)
  • -(subtraction)
  • /(division)
  • %(modulo)

// 더하기 연산 예제 
class Addition { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int num1 = 10, num2 = 20, sum = 0; 
  
        // Displaying num1 and num2 
        System.out.println("num1 = " + num1); 
        System.out.println("num2 = " + num2); 
  
        // adding num1 and num2 
        sum = num1 + num2; 
        System.out.println("The sum = " + sum); 
    } 
} 

// 곱하기 연산 예제
class Multiplication { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int num1 = 20, num2 = 10, mult = 0; 
  
        // Displaying num1 and num2 
        System.out.println("num1 = " + num1); 
        System.out.println("num2 = " + num2); 
  
        // Multiplying num1 and num2 
        mult = num1 * num2; 
        System.out.println("Multiplication = " + mult); 
    } 
} 

// 빼기 연산 예제
class Subtraction { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int num1 = 20, num2 = 10, sub = 0; 
  
        // Displaying num1 and num2 
        System.out.println("num1 = " + num1); 
        System.out.println("num2 = " + num2); 
  
        // subtracting num1 and num2 
        sub = num1 - num2; 
        System.out.println("Subtraction = " + sub); 
    } 
} 

// 나누기 연산 예제
class Division { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int num1 = 20, num2 = 10, div = 0; 
  
        // Displaying num1 and num2 
        System.out.println("num1 = " + num1); 
        System.out.println("num2 = " + num2); 
  
        // Dividing num1 and num2 
        div = num1 / num2; 
        System.out.println("Division = " + div); 
    } 
} 

// 나머지 연산 예제
class Modulus { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int num1 = 5, num2 = 2, mod = 0; 
  
        // Displaying num1 and num2 
        System.out.println("num1 = " + num1); 
        System.out.println("num2 = " + num2); 
  
        // Remaindering num1 and num2 
        mod = num1 % num2; 
        System.out.println("Remainder = " + mod); 
    } 
} 

2. 비트 연산자

비트 연산자는 숫자의 개별 비트를 조작하는 데 사용됩니다. 그것들은 (char, short, int 등)과 함께 사용될 수 있고 Binary indexed tree 업데이트 및 쿼리 작업을 수행할 때 사용되기도 합니다.

종류는 다음과 같습니다.

Bitwise OR (|)

이 연산자는 이항 연산자로 '|'로 표시됩니다. 입력 값 중 비트 OR을 반환하고 비트 중 하나가 1이면 1을 그렇지 않으면 0을 반환합니다.

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

Bitwise OR Operation of 5 and 7
0101
| 0111


0111 = 7 (In decimal)

Bitwise AND (&)

이 연산자는 '&'로 표시된 이항 연산자입니다. 입력 값의 비트 AND를 반환하는데 두 비트가 모두 1이면 1을 그렇지 않으면 0을 반환합니다.

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

Bitwise AND Operation of 5 and 7
0101
& 0111


0101 = 5 (In decimal)

Bitwise XOR (^)

이 연산자는 이항 연산자로 '^'로 표시됩니다. 입력값의 비트 XOR를 반환하고 해당 비트가 다르면 1을, 그렇지 않으면 0을 반환합니다.

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

Bitwise XOR Operation of 5 and 7
0101
^0111


0010 = 2 (In decimal)

Bitwise Complement (~)

이 연산자는 단항 연산자로 '~'로 표시됩니다. 입력 값에 반대로 반환합니다. 즉, 모든 비트를 뒤집어서 반환하는 걸 의미합니다.

a = 5 = 0101 (In Binary)

Bitwise Compliment Operation of 5

~ 0101


1010 = 10 (In decimal)


3. 관계 연산자

관계 연산자는 두 피연산자의 관계를 표현합니다. 즉 값이 같다. ~보다 크다, ~보다 작다를 포함한 두 피연산자 사이의 관계를 확인하는 데 사용되는 일련의 이진 연산자입니다.

종류는 다음과 같습니다.

Equal to’ operator (==)

이 연산자는 주어진 두 피연산자가 동일한지 여부를 확인하는 데 사용됩니다. 왼쪽의 피연산자가 오른쪽의 피연산자와 같을 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.

class Relational { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int var1 = 5, var2 = 10, var3 = 5; 
  
        // Displaying var1, var2, var3 
        System.out.println("Var1 = " + var1); 
        System.out.println("Var2 = " + var2); 
        System.out.println("Var3 = " + var3); 
  
        // Comparing var1 and var2 
        System.out.println("var1 == var2: "
                           + (var1 == var2)); 
  
        // Comparing var1 and var3 
        System.out.println("var1 == var3: "
                           + (var1 == var3)); 
    } 
} 

Not equal to’ Operator(!=)

이 연산자는 주어진 두 피연산자가 동일한지 여부를 확인하는 데 사용됩니다. == Operator와 반대라고 생각하시면 됩니다. 왼쪽의 피연산자가 오른쪽과 같지 않으면 true로 반환되며, 그렇지 않으면 false로 반환됩니다.

class Relational { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int var1 = 5, var2 = 10, var3 = 5; 
  
        // Displaying var1, var2, var3 
        System.out.println("Var1 = " + var1); 
        System.out.println("Var2 = " + var2); 
        System.out.println("Var3 = " + var3); 
  
        // Comparing var1 and var2 
        System.out.println("var1 == var2: "
                           + (var1 != var2)); 
  
        // Comparing var1 and var3 
        System.out.println("var1 == var3: "
                           + (var1 != var3)); 
    } 
} 

Greater than’ operator(>)

이 연산자는 첫 번째 피연산자가 두 번째 피연산자보다 큰지 여부를 확인합니다. 왼쪽의 피연산자가 오른쪽보다 클 때 참으로 반환합니다.

class Relational { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int var1 = 30, var2 = 20, var3 = 5; 
  
        // Displaying var1, var2, var3 
        System.out.println("Var1 = " + var1); 
        System.out.println("Var2 = " + var2); 
        System.out.println("Var3 = " + var3); 
  
        // Comparing var1 and var2 
        System.out.println("var1 > var2: "
                           + (var1 > var2)); 
  
        // Comparing var1 and var3 
        System.out.println("var3 > var1: "
                           + (var3 >= var1)); 
    } 
} 

Less than’ Operator(<)

이 연산자는 첫 번째 피연산자가 두 번째 피연산자보다 작은지 여부를 확인합니다. 왼쪽의 피연산자가 오른쪽보다 작을 때 참으로 반환합니다.

class Relational { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int var1 = 10, var2 = 20, var3 = 5; 
  
        // Displaying var1, var2, var3 
        System.out.println("Var1 = " + var1); 
        System.out.println("Var2 = " + var2); 
        System.out.println("Var3 = " + var3); 
  
        // Comparing var1 and var2 
        System.out.println("var1 < var2: "
                           + (var1 < var2)); 
  
        // Comparing var2 and var3 
        System.out.println("var2 < var3: "
                           + (var2 < var3)); 
    } 
} 

Greater than or equal to' operator(>=)

이 연산자는 첫 번째 피연산자가 두 번째 피연산자보다 크거나 같은지 여부를 확인합니다. 왼쪽의 피연산자가 오른쪽보다 크거나 같으면 참으로 반환합니다.

class Relational { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int var1 = 20, var2 = 20, var3 = 10; 
  
        // Displaying var1, var2, var3 
        System.out.println("Var1 = " + var1); 
        System.out.println("Var2 = " + var2); 
        System.out.println("Var3 = " + var3); 
  
        // Comparing var1 and var2 
        System.out.println("var1 >= var2: "
                           + (var1 >= var2)); 
  
        // Comparing var2 and var3 
        System.out.println("var2 >= var3: "
                           + (var3 >= var1)); 
    } 
} 

Less than or equal to' Operator(<)

이것은 첫 번째 피연산자가 두 번째 피연산자보다 작거나 같은지 여부를 확인합니다. 왼쪽의 피연산자가 오른쪽보다 작거나 같으면 참을 반환합니다

class Relational { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int var1 = 10, var2 = 10, var3 = 9; 
  
        // Displaying var1, var2, var3 
        System.out.println("Var1 = " + var1); 
        System.out.println("Var2 = " + var2); 
        System.out.println("Var3 = " + var3); 
  
        // var1 <= var2: true
        System.out.println("var1 <= var2: "
                           + (var1 <= var2)); 
  
        // var2 <= var3: false
        System.out.println("var2 <= var3: "
                           + (var2 <= var3)); 
    } 
} 

4. 논리 연산자

논리 연산자는 논리적인 "AND", "OR" 및 "NOT" 연산, 즉 디지털 전자 장치의 AND 게이트 및 OR 게이트와 유사한 기능을 수행하는 데 사용됩니다. 이것들은 둘 이상의 조건들을 따지기 위해 사용됩니다. 한 가지 명심해야 할 점은 첫 번째 조건이 거짓일 경우, 즉 단락 효과가 있을 경우 두 번째 조건이 실행되지 않는다는 점입니다.

‘Logical AND’ Operator(&&)

이 연산자는 고려 중인 조건이 모두 충족되거나 참인 경우 참으로 반환한다. 두 개 중 한 개라도 거짓이 나오면 운영자는 거짓 결과를 반환합니다.

class Logical { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int a = 10, b = 20, c = 20, d = 0; 
  
        // Displaying a, b, c 
        System.out.println("Var1 = " + a); 
        System.out.println("Var2 = " + b); 
        System.out.println("Var3 = " + c); 
  
        // using logical AND to verify 
        // two constraints 
        if ((a < b) && (b == c)) { 
            d = a + b + c; 
            // 출력됩니다. 
            System.out.println("The sum is: " + d); 
        } 
        else
            System.out.println("False conditions"); 
    } 
} 

Logical OR' Operator(||)

이 연산자는 고려 중인 두 조건 중 하나만 충족되도 참으로 반환되고 실행됩니다. 둘 중 하나라도 참이면 연산자는 참입니다. 결과를 거짓으로 만들려면 두 제약조건 모두 거짓으로 만들면 됩니다.

class Logical { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int a = 10, b = 1, c = 10, d = 30; 
  
        // Displaying a, b, c 
        System.out.println("Var1 = " + a); 
        System.out.println("Var2 = " + b); 
        System.out.println("Var3 = " + c); 
        System.out.println("Var4 = " + d); 
  
        // using logical OR to verify 
        // two constraints 
        if (a > b || c == d) 
            // 출력됩니다. 
            System.out.println("One or both"
                               + " the conditions are true"); 
        else
            System.out.println("Both the"
                               + " conditions are false"); 
    } 
} 

Logical NOT' Operator(!)

앞의 두 가지와 달리 이것은 단항 연산자로, 거짓 조건일 때 참으로 반환합니다. 기본적으로 조건이 거짓이면 연산은 참으로, 조건이 참이면 연산은 거짓으로 반환합니다.

class Logical { 
    public static void main(String[] args) 
    { 
        // initializing variables 
        int a = 10, b = 1; 
  
        // Displaying a, b, c 
        System.out.println("Var1 = " + a); 
        System.out.println("Var2 = " + b); 
  
        // Using logical NOT operator 
        System.out.println("!(a < b) = " + !(a < b)); // !(a < b) = true
        System.out.println("!(a > b) = " + !(a > b)); // !(a > b) = false
    } 
} 

5. instanceof

instanceof는 참조 변수가 지정된 유형의 객체 참조를 포함하고 있는지 여부를 확인하는 데 사용되는 키워드입니다.

다음 예시를 보겠습니다.

class Parent {  } 
class Child extends Parent { } 
  
class Test 
{ 
    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"); 
  
        // instanceof returns true for Parent class also  
        if (cobj instanceof Parent) 
           System.out.println("cobj is instance of Parent"); // 출력됩니다. 
        else
           System.out.println("cobj is NOT instance of Parent"); 
  
        // instanceof returns true for all ancestors (Note : Object 
        // is ancestor of all classes in Java)  
        if (cobj instanceof Object) 
           System.out.println("cobj is instance of Object");  // 출력됩니다. 
        else
           System.out.println("cobj is NOT instance of Object");            
    } 
} 

instanceof returns false for null

// Java program to demonstrate that instanceof 
// returns false for null 
  
class Test {  } 
  
class Main 
{ 
    public static void main(String[] args) 
    { 
        Test tobj = null; 
  
        // A simple case 
        if (tobj instanceof Test) 
           System.out.println("tobj is instance of Test"); 
        else
           System.out.println("tobj is NOT instance of Test"); // 출력됩니다. 
    } 
} 

A parent object is not an instance of Child


// A Java program to show that a parent object is 
// not an instance of Child 
  
class Parent {  } 
class Child extends Parent { } 
  
class Test 
{ 
    public static void main(String[] args) 
    { 
        Parent pobj = new Parent(); 
        if (pobj instanceof Child) 
           System.out.println("pobj is instance of Child"); 
        else
           System.out.println("pobj is NOT instance of Child"); // 출력됩니다. 
    } 
} 

A parent reference referring to a Child is an instance of Child

  
class Parent {  } 
class Child extends Parent { } 
  
class Test 
{ 
    public static void main(String[] args) 
    { 
        // Reference is Parent type but object is 
        // of child type. 
        Parent cobj = new Child(); 
        if (cobj instanceof Child) 
           System.out.println("cobj is instance of Child"); // 출력됩니다. 
        else
           System.out.println("cobj is NOT instance of Child"); 
    } 
} 

6. assignment(=) operator

이 연산자는 변수에 값을 할당하는 데 사용됩니다. 할당 연산자의 왼쪽 피연산자는 변수이고, 할당 연산자의 오른쪽 피연산자는 값입니다. 오른쪽의 값은 왼쪽의 피연산자와 동일한 데이터 형식이어야 하며 그렇지 않으면 컴파일러가 오류를 발생시킵니다. 즉, Operator의 오른쪽에 주어진 값은 왼쪽 변수에 할당되므로 오른쪽 변수의 값을 사용하기 전에 선언하거나 상수여야 합니다.

class Assignment { 
    public static void main(String[] args) 
    { 
  
        // Declaring variables 
        int num; 
        String name; 
  
        // Assigning values 
        num = 10; 
        name = "GeeksforGeeks"; 
  
        // Displaying the assigned values 
        System.out.println("num is assigned: " + num);  // num is assigned: 10
        System.out.println("name is assigned: " + name); // name is assigned: GeeksforGeeks
    } 
} 

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

화살표 연산자는 람다 표현으로 기본적으로 Functional interfaces의 인스턴스를 표현합니다.

람다 표현식은 Java 8에서 추가되었고 유일한 추상적 함수를 구현하여 Functional interfaces를 구현합니다.

// Java program to demonstrate lambda expressions 
// to implement a user defined functional interface. 
  
// A sample functional interface (An interface with 
// single abstract method 
interface FuncInterface 
{ 
    // An abstract function 
    void abstractFun(int x); 
  
    // A non-abstract (or default) function 
    default void normalFun() 
    { 
       System.out.println("Hello"); 
    } 
} 
  
class Test 
{ 
    public static void main(String args[]) 
    { 
        // lambda expression to implement above 
        // functional interface. This interface 
        // by default implements abstractFun() 
        FuncInterface fobj = (int x)->System.out.println(2*x); 
  
        // This calls above lambda expression and prints 10. 
        fobj.abstractFun(5); 
    } 

Zero parameter

() -> System.out.println("Zero parameter lambda");

One parameter

(p) -> System.out.println("One parameter: " + p);

Multiple parameters

(p1, p2) -> System.out.println("Multiple parameters: " + p1 + ", " + p2);


8. 3항 연산자

3개의 피연산자를 사용하는 유일한 조건부 연산자는 자바의 3항 연산자입니다. if-ten-else문을 하나의 원라이너로 교체할 수 있는 방법입니다. if-else 조건 대신 3항 연산자를 사용할 수도 있습니다. if-else 문과 동일한 알고리즘을 따르지만, 조건부 운영자는 if-else문 보다 코드 공간을 적게 차지한다는 특징이 있습니다.

Syntax

variable = Expression1 ? Expression2: Expression3


class Ternary { 
    public static void main(String[] args) 
    { 
  
        // variable declaration 
        int n1 = 5, n2 = 10, max; 
  
        System.out.println("First num: " + n1);  // First num: 5
        System.out.println("Second num: " + n2); // Second num: 10
  
        // Largest among n1 and n2 
        max = (n1 > n2) ? n1 : n2; 
  
        // Print the largest number 
        System.out.println("Maximum is = " + max); // Maximum is = 10

    } 
} 

9. 연산자 우선 순위

아래 표는 자바에서 연산자의 우선순위를 나열하고 있으며, 표에 더 높이 있을수록 그 우선순위가 더 높습니다.

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

10. Java 13. switch 연산자

Java 13에서는 Java 12 Switch Expressions에 새로운 yield 키워드가 추가되었습니다.

Java 12

// value breaks are superseded by Java 13 'yield' statements.
private static int getValueViaBreak(String mode) {
        int result = switch (mode) {
            case "a":
            case "b":
                break 1;
            case "c":
                break 2;
            case "d":
            case "e":
            case "f":
                break 3;
            default:
                break -1;
        };
        return result;
    }
   

Java 13


 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;
    }

arrows from a switch expression (Java 12) is still supported in Java 13.


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

profile
좋은 습관을 가지고 싶은 평범한 개발자입니다.

0개의 댓글