[스터디할래 03] 자바가 제공하는 다양한 연산자
이 글은 ‘백기선’ 개발자님과 함께하는 온라인 자바 스터디에 참여하여 준비/학습한 내용을 정리하는 글입니다.📚
- 3주차 : https://github.com/whiteship/live-study/issues/3
- 목표 : 자바가 제공하는 다양한 연산자를 학습.
정리는 The Java Language Specification, Oracle, Leraning the Java Language를 기반으로 하였습니다.
자바에서 제공하는 연산자
- 총 32가지의 연산자를 제공한다.
= > < ! ~ ? : ->
== >= <= != && || ++ --
+ - * / & | ^ % << >> >>>
+= -= *= /= &= |= ^= %= <<= >>= >>>=
산술 연산자
+ - * / %
- 사칙연산용 연산자와 나눗셈의 나머지를 반환하는
%
연산자로 이루어져 있다.
Relational Operators
< > <= >= instanceof
- 왼쪽에서부터 그루핑된다(=left associative).
- relational expression의 결과는 항상
boolean
이다. - Type Comparison Operator인
instanceof
도 관계 연산자 중 하나라는 점이 특이했다.
Bitwise, Logical Operators
- AND
&
, exclusive OR^
, inclusive OR|
를 포함한다. - numeric type 이거나
bollean
type의 피연산자만 허용된다.(그 외는 컴파일 에러) - left-associative 하다.(= 왼쪽에서부터 연산된다.)
&
가|
보다 우선순위가 높다.
Bitwise Operators
&
: 피연산자 모두true
인 경우true
, 그 외는false
^
: 피연산자의 boolean 타입이 다른 경우true
, 그 외는false
|
: 피연산자 모두false
인 경우false
, 그 외는ture
Logical Operators
&&
,||
,!
&&
: 피연산자 모두true
인 경우true
, 그 외는false
||
: 피연산자 중 하나라도true
인 경우true
, 그 외는false
!
: boolean 표현식의 반대의 타입 반환
instanceof
- Type Comparison Operator 이며, 관계형 연산자에 속한다.
instanceof
의 operand(operate 대상)는 반드시 레터런스 타입이거나null
타입이어야 한다.(그 외 컴파일에러)- 주로 클래스를 다른 클래스로 캐스팅할 때
ClassCastExceptionn
을 막기 위해 확인용으로 사용된다. - 컴파일 시점에
instanceof
연산자는 미리 operand들의 ReferenceType을 확인하여 class간 비교 가능한지 확인하여 그렇지 않은 경우 컴파일 에러를 유발한다. - 아래 예시는 실제로
e instance of Point
의 결과가false
가 아니라 아예 컴파일에러다.class Point { int x, y; } class Element { int atomicNumber; } class Test { public static void main(String[] args) { Point p = new Point(); Element e = new Element(); if (e instanceof Point) { // compile-time error System.out.println("I get your point!"); p = (Point)e; // compile-time error } } }
Assignment(=
) Operator
- 12개의 assignment operators가 존재한다. 오른쪽에서부터 그루핑 된다(=right associative). 예를 들어
a=b=c
는a=(b=c)
순서로 연산된다.= *= /= %= += -= <<= >>= >>>= &= ^= |=
- 컴파일 시점에 assignment operator의 첫 번째 operand는 변수여야한다.
- 런타임 시점에 연산의 결과가 변수에 할당된다.
Arrow(->
) Operator
- Java 8에 추가된 람다 함수 정의용 연산자이다.
(parameters) -> { statements; }
좌측 피연산자는 파라미터를, 우측 피연산자는 구현체를 정의한다./* 컴파일 시점에 parameter의 타입을 유추한다 */ (a, b) -> { a + b; }
Three operand expression(? :
)
- Conditional Operator 표현식의 하나로 두 개의 표현식 중 어느 표현식을 사용할 지
boolean
값으로 선택하는 표현식이다. - 예를 들어,
a ? b : c
는a
가ture
인 경우b
표현식을,false
인 경우는c
표현식을 사용한다. - conditional operator의 경우 right-associative 이다. 즉,
a?b:c?d:e?f:g
는a?b:(c?d:(e?f:g))
를 의미한다. (단, 3항연산의 경우 가독성이 떨어지기 때문에 짧은 경우에만 사용하는 것이 좋다.)
연산자 우선 순위
- 연산자간 우선순위는 문법 생성 위계에 의해 조절된다.
- 표현식의 순서는 외부적으로는 괄호(
()
)로, 내부적으로는 연산자 우선순위에 의해 조절된다. - 각 연산자마다 left-associative한지, right-associative한지에 따라 우선순위가 조절된다.
- 전체 연산자 중 가장 낮은 우선순위의 연산자는
->
연산자이다. 그 다음은 할당(=
) 연산자이다. ```