반응형
목표
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- 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 |