-
[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 statement 를 expression으로 추가한걸로 보임
-
구조
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 사용
- case : 말고도 case -> 사용 가능
-
oracle 문서에서는 arrow case 라벨을 사용하는 것을 권장함
- 이유:
- colon case 라벨을 사용하면 헷갈릴 수 있음
- 헷갈리게 되면 의도하지 않은 fall through 가 발생할 수 있음
- 이유:
반응형'Java > Java 기본 및 이론' 카테고리의 다른 글
[Java] 자바 기본 제어문 - 선택문, 반복문 (0) 2021.01.11 [Java] junit5 설명 및 기본 사용 - junit4 와 5 비교 (0) 2021.01.11 [Java] 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법 (0) 2021.01.03 [Java] 자바 UnsupportedClassVersionError 원인 (javac -target) (0) 2020.12.28 [JAVA] JVM 구조 (0) 2020.12.27