자바가 제공하는 다양한 연산자를 정리합니다.
학습할 내용은 다음과 같습니다.
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- Java 13. switch 연산자
Reference: Java in a Nutshell
Operator는 모든 프로그래밍 언어의 기본 구성 요소를 구성합니다. Java 역시 논리, 산술, 관계 등 다양한 계산과 함수를 수행할 필요성에 따라 사용할 수 있는 많은 유형의 연산자를 제공합니다.
산술 연산자는 피연산자라 불리는 원시 데이터 유형에 대해 다양한 산술 연산을 수행하는 데 사용할 수 있는 수학적 연산자를 포함합니다.
종류는 다음과 같습니다.
// 더하기 연산 예제
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);
}
}
비트 연산자는 숫자의 개별 비트를 조작하는 데 사용됩니다. 그것들은 (char, short, int 등)과 함께 사용될 수 있고 Binary indexed tree 업데이트 및 쿼리 작업을 수행할 때 사용되기도 합니다.
종류는 다음과 같습니다.
이 연산자는 이항 연산자로 '|'로 표시됩니다. 입력 값 중 비트 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)
이 연산자는 '&'로 표시된 이항 연산자입니다. 입력 값의 비트 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)
이 연산자는 이항 연산자로 '^'로 표시됩니다. 입력값의 비트 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)
이 연산자는 단항 연산자로 '~'로 표시됩니다. 입력 값에 반대로 반환합니다. 즉, 모든 비트를 뒤집어서 반환하는 걸 의미합니다.
a = 5 = 0101 (In Binary)
Bitwise Compliment Operation of 5
~ 0101
1010 = 10 (In decimal)
관계 연산자는 두 피연산자의 관계를 표현합니다. 즉 값이 같다. ~보다 크다, ~보다 작다를 포함한 두 피연산자 사이의 관계를 확인하는 데 사용되는 일련의 이진 연산자입니다.
종류는 다음과 같습니다.
이 연산자는 주어진 두 피연산자가 동일한지 여부를 확인하는 데 사용됩니다. 왼쪽의 피연산자가 오른쪽의 피연산자와 같을 경우 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));
}
}
이 연산자는 주어진 두 피연산자가 동일한지 여부를 확인하는 데 사용됩니다. == 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));
}
}
이 연산자는 첫 번째 피연산자가 두 번째 피연산자보다 큰지 여부를 확인합니다. 왼쪽의 피연산자가 오른쪽보다 클 때 참으로 반환합니다.
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));
}
}
이 연산자는 첫 번째 피연산자가 두 번째 피연산자보다 작은지 여부를 확인합니다. 왼쪽의 피연산자가 오른쪽보다 작을 때 참으로 반환합니다.
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));
}
}
이 연산자는 첫 번째 피연산자가 두 번째 피연산자보다 크거나 같은지 여부를 확인합니다. 왼쪽의 피연산자가 오른쪽보다 크거나 같으면 참으로 반환합니다.
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));
}
}
이것은 첫 번째 피연산자가 두 번째 피연산자보다 작거나 같은지 여부를 확인합니다. 왼쪽의 피연산자가 오른쪽보다 작거나 같으면 참을 반환합니다
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));
}
}
논리 연산자는 논리적인 "AND", "OR" 및 "NOT" 연산, 즉 디지털 전자 장치의 AND 게이트 및 OR 게이트와 유사한 기능을 수행하는 데 사용됩니다. 이것들은 둘 이상의 조건들을 따지기 위해 사용됩니다. 한 가지 명심해야 할 점은 첫 번째 조건이 거짓일 경우, 즉 단락 효과가 있을 경우 두 번째 조건이 실행되지 않는다는 점입니다.
이 연산자는 고려 중인 조건이 모두 충족되거나 참인 경우 참으로 반환한다. 두 개 중 한 개라도 거짓이 나오면 운영자는 거짓 결과를 반환합니다.
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");
}
}
이 연산자는 고려 중인 두 조건 중 하나만 충족되도 참으로 반환되고 실행됩니다. 둘 중 하나라도 참이면 연산자는 참입니다. 결과를 거짓으로 만들려면 두 제약조건 모두 거짓으로 만들면 됩니다.
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");
}
}
앞의 두 가지와 달리 이것은 단항 연산자로, 거짓 조건일 때 참으로 반환합니다. 기본적으로 조건이 거짓이면 연산은 참으로, 조건이 참이면 연산은 거짓으로 반환합니다.
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
}
}
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");
}
}
// 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 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"); // 출력됩니다.
}
}
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");
}
}
이 연산자는 변수에 값을 할당하는 데 사용됩니다. 할당 연산자의 왼쪽 피연산자는 변수이고, 할당 연산자의 오른쪽 피연산자는 값입니다. 오른쪽의 값은 왼쪽의 피연산자와 동일한 데이터 형식이어야 하며 그렇지 않으면 컴파일러가 오류를 발생시킵니다. 즉, 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
}
}
화살표 연산자는 람다 표현으로 기본적으로 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);
}
() -> System.out.println("Zero parameter lambda");
(p) -> System.out.println("One parameter: " + p);
(p1, p2) -> System.out.println("Multiple parameters: " + p1 + ", " + p2);
3개의 피연산자를 사용하는 유일한 조건부 연산자는 자바의 3항 연산자입니다. if-ten-else문을 하나의 원라이너로 교체할 수 있는 방법입니다. if-else 조건 대신 3항 연산자를 사용할 수도 있습니다. if-else 문과 동일한 알고리즘을 따르지만, 조건부 운영자는 if-else문 보다 코드 공간을 적게 차지한다는 특징이 있습니다.
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
}
}
아래 표는 자바에서 연산자의 우선순위를 나열하고 있으며, 표에 더 높이 있을수록 그 우선순위가 더 높습니다.
Operators | Precedence |
---|---|
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 | = += -= *= /= %= &= ^= |
Java 13에서는 Java 12 Switch Expressions에 새로운 yield 키워드가 추가되었습니다.
// 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;
}
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;
}
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;
}