Dart는 아래 표의 연산자들을 지원한다.
설명 |
연산자 |
결합법칙 |
unary postfix |
expr++ expr-- () [] ?[] . ?. ! |
None |
unary prefix |
-expr !expr ~expr ++expr --expr await expr |
None |
multiplicative |
* / % ~/ |
Left |
additive |
+ - |
Left |
shift |
<< >> >>> |
Left |
bitwise AND |
& |
Left |
bitwise XOR |
^ |
Left |
bitwise OR |
| |
Left |
relational and type test |
>= > <= < as is is! |
None |
equality |
== != |
None |
logical AND |
&& |
Left |
logical OR |
|| |
Left |
if null |
?? |
Left |
conditional |
expr1 ? expr2 : expr3 |
Right |
cascade |
.. ?.. |
Left |
assignment |
= *= /= += -= &= ^= etc. |
Right |
기존에 익숙하던 연산자들도 보이고, 이게 뭔가하는 연산자들도 보인다. 각각의 연산자들이 어떤 역할을 하는지 알아보자.
산술 연산자
연산자 |
설명 |
+ |
더하기 |
- |
빼기 |
-expr |
부정(negation)으로도 부르는 단항 빼기 (식 부호 역순) / 뭐지 ..? 그냥 음수를 표현한다는 의미인가 |
* |
곱하기 |
/ |
나누기 |
~/ |
정수를 반환하는 나누기 |
% |
정수 나눗셈의 나머지를 반환 (modulo) |
++var |
var = var + 1 (식의 값은 var + 1) |
var++ |
var = var + 1 (식의 값은 var) |
--var |
var = var - 1 (식의 값은 var - 1) |
var-- |
var = var - 1 (식의 값은 var) |
다 익숙하지만 "~/" 이 연산자는 처음보는 연산자다. 정수를 반환하는 나누기... 설명도 애매하고.. 직접 사용한 예시를 알아보자
void main() {
print(100 / 8); // double형 반환 기존의 나눗셈
print(100 ~/ 8); // 나눗셈의 몫을 반환
print(100 % 8); // 나눗셈의 나머지를 반환
}
동등, 관계 연산자
연산자 |
설명 |
== |
동등 |
!= |
동등하지 않음 |
> |
큼 |
< |
작음 |
>= |
크거나 같음 |
<= |
작거나 같음 |
동등연산자는 두 객체 x, y가 동일한지도 확인할 수 있다. 다만, 정확하게 같은 것인지 확인하려면 identical() 함수를 사용하면 된다.
void main() {
var o = new Object();
var isIdentical = identical(o, new Object()); // false, different objects.
isIdentical = identical(o, o); // true, same object.
isIdentical = identical(const Object(), const Object()); // true, const canonicalizes.
isIdentical = identical([1], [1]); // false, different new objects.
isIdentical = identical(const [1], const [1]); // true.
isIdentical = identical(const [1], const [2]); // false.
isIdentical = identical(2, 1 + 1); // true, integers canonicalize.
var pair = (1, "a"); // Create a record.
isIdentical = identical(pair, pair); // true or false, can be either.
var pair2 = (1, "a"); // Create another(?) record.
isIdentical = identical(pair, pair2); // true or false, can be either.
isIdentical = identical(pair, (2, "a")); // false, not identical values.
isIdentical = identical(pair, (1, "a", more: true)); // false, wrong shape.
}
타입 테스트 연산자
연산자 |
설명 |
as |
타입캐스트 (라이브러리 프리픽스 지정할 때에도 사용) |
is |
특정된 타입을 가지는 객체라면 True |
is! |
특정된 타입을 가지는 객체가 아니라면 True |
as, is, is! 연산자는 런타임중 타입을 확인하는 방법이다.
할당 연산자
"=" 연산자를 이용해서 값을 할당 할 수 있다. 이외에도 복합 할당 연산자를 제공하는데 아래와 같다.
= |
*= |
%= |
>>>= |
^= |
+= |
/= |
<<= |
&= |
**` |
-= |
~/= |
>>= |
|
|
논리 연산자
연산자 |
설명 |
!expr |
뒤따르는 식을 반전합니다 (false -> true, true -> false) |
|| |
논리 OR |
&& |
논리 AND |
비트, 쉬프트 연산자
연산자 |
설명 |
& |
AND |
| |
OR |
^ |
XOR |
~expr |
단항 비트 단위 보수 (0s -> 1s; 1s -> 0s) |
<< |
Shift left |
>> |
Shift right |
>>> |
Unsigned shift right |
조건 표현식
- "조건 ? 표현식1 : 표현식2"
- 만약 조건이 참이라면 표현식 1을 평가하고 반환하고, 그렇지 않다면 표현식 2를 평가하고 반환한다.
- "표현식1 ?? 표현식2"
- 만약 표현식1이 null이 아니라면 값을 반환하고 그렇지 않다면 표현식2의 값을 평가하고 반환한다.
기타 연산자
연산자 |
이름 |
설명 |
() |
함수 어플리케이션 |
함수 호출을 표현 |
[] |
첨자 접근 |
오버라이드 가능한 [] 연산자의 호출을 표현. 예로 fooList[1]은 int 1을 전달해 fooList의 인덱스 1인 요소에 접근합니다. |
?[] |
조건부 첨자 접근 |
[]와 비슷하지만 왼쪽 피연산자가 null일 수 있습니다. 예로, fooList?[1]은 int 1을 전달해 fooList의 인덱스 1인 요소에 접근하지만 fooList가 null일 수 있습니다. (그럴 경우 null로 계산됨) |
. |
멤버 접근 |
표현식의 속성을 참조. 예로, foo.bar는 표현식 foo에서 bar 속성을 선택합니다. |
?. |
조건부 멤버 접근 |
.와 비슷하지만 왼쪽 피연산자가 null일 수 있습니다. 예로, foo?.bar는 표현식 foo에서 bar 속성을 선택하지만 foo가 null일 수 있습니다. (그럴 경우 foo?.bar는 null) |
! |
Null 표명 연산자 |
표현식을 non-nullable 형식으로 캐스팅합니다. 캐스트에 실패하면 런타임 예외가 발생합니다. 예로, foo!.bar는 foo가 null이 아니면 bar 속성을 선택하고, foo가 null이면 런타임 예외를 발생시킨다고 표명합니다. |