Dart는 아래 표에 표시된 연산자를 정의합니다. 재정의 가능한 연산자에 설명 된대로 이러한 연산자 중 다수를 재정의 할 수 있습니다.
주의:
연산자 우선 순위는 Dart 파서 동작의 근사치입니다. 확실한 답은 Dart 언어 사양의 문법을 참조하십시오.
연산자를 사용하면 표현식이 생성됩니다. 다음은 연산자 표현식의 몇 가지 예시입니다.
a++
a + b
a = b
a == b
c ? a : b
a is T
연산자 테이블에서 각 연산자는 뒤에 오는 행의 연산자보다 우선 순위가 높습니다. 예를 들어 곱셈 연산자 %
는 논리 AND
연산자 &&
보다 우선 순위가 높은 같음 연산자 ==
보다 우선 순위가 더 높습니다 (따라서 이전에 실행 됨). 이 우선 순위는 다음 두 줄의 코드가 동일한 방식으로 실행됨을 의미합니다.
// 괄호로 가독성을 향상시킵니다.
if ((n % i == 0) && (d % i == 0)) ...
// 가독성이 떨어지지만, 같은 논리식입니다.
if (n % i == 0 && d % i == 0) ...
주의: 두 개의 피연산자에 대해 작업하는 연산자의 경우 가장 왼쪽에있는 피연산자가 사용되는 연산자 버전을 결정합니다. 예를 들어 Vector 객체와 Point 객체가있는 경우
aVector + aPoint
는 Vector 버전의+
를 사용합니다.
Dart는 다음 표와 같이 일반적인 산술 연산자를 지원합니다.
assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // Result is a double
assert(5 ~/ 2 == 2); // Result is an int
assert(5 % 2 == 1); // Remainder
assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
Dart는 또한 접두사 및 접미사 증가 및 감소 연산자를 모두 지원합니다.
var a, b;
a = 0;
b = ++a; // Increment a before b gets its value.
assert(a == b); // 1 == 1
a = 0;
b = a++; // Increment a AFTER b gets its value.
assert(a != b); // 1 != 0
a = 0;
b = --a; // Decrement a before b gets its value.
assert(a == b); // -1 == -1
a = 0;
b = a--; // Decrement a AFTER b gets its value.
assert(a != b); // -1 != 0
다음 표에는 같음 및 관계 연산자의 의미가 나열되어 있습니다.
두 객체 x
와 y
가 같은 것을 나타내는 지 테스트하려면 ==
연산자를 사용하십시오. (드물게 두 객체가 정확히 동일한 객체인지 알아야하는 경우에는 대신 same()
함수를 사용하십시오.) ==
연산자의 작동 방식은 다음과 같습니다.
x
또는 y
가 둘 다 null
이면 true
를 반환하고 하나만 null
이면 false
를 반환합니다.x. == (y)
의 결과를 반환합니다. (맞습니다. ==
와 같은 연산자는 첫 번째 피연산자에서 호출되는 메서드입니다. 재정의 가능 연산자에서 볼 수 있듯이 ==
를 비롯한 많은 연산자를 재정의 할 수도 있습니다.)다음은 같음 및 관계 연산자를 각각 사용하는 예입니다.
assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);
as
, is
, is!
연산자는 런타임에 유형을 확인하는 데 편리합니다.
obj is T
로 지정된 인터페이스를 구현하는 경우 obj
의 결과는 T
가 true
입니다. 예를 들어 obj is Object
가 항상 true
입니다.
객체가 해당 유형인지 확신하는 경우에만 as
연산자를 사용하여 객체를 특정 유형으로 캐스트하십시오.
(emp as Person).firstName = 'Bob';
개체가 T 유형인지 확실하지 않은 경우 개체를 사용하기 전에 is T
를 사용하여 유형을 확인합니다.
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
코드가 동일하지 않습니다.
emp
가null
이거나Person
이 아니면 첫 번째 예제는 예외를 던집니다. 두 번째는 아무것도 하지 않습니다.
이미 살펴본 것처럼 =
연산자를 사용하여 값을 할당 할 수 있습니다. 할당 대상 변수가 null
인 경우에만 할당하려면 ??=
연산자를 사용합니다.
// Assign value to a
a = value;
// Assign value to b if b is null; otherwise, b stays the same
b ??= value;
+=
와 같은 복합 할당 연산자는 연산과 할당을 결합합니다.
복합 할당 연산자의 작동 방식은 다음과 같습니다.
다음 예에서는 할당 및 복합 할당 연산자를 사용합니다.
var a = 2; // Assign using =
a *= 3; // Assign and multiply: a = a * 3
assert(a == 6);
논리 연산자를 사용하여 부울 식을 반전하거나 결합 할 수 있습니다.
다음은 논리 연산자를 사용하는 예입니다.
if (!done && (col == 0 || col == 3)) {
// ...Do something...
}
Dart에서 개별 숫자 비트를 조작 할 수 있습니다. 일반적으로 정수와 함께 이러한 비트 및 시프트 연산자를 사용합니다.
다음은 비트 및 시프트 연산자를 사용하는 예입니다.
final value = 0x22;
final bitmask = 0x0f;
assert((value & bitmask) == 0x02); // AND
assert((value & ~bitmask) == 0x20); // AND NOT
assert((value | bitmask) == 0x2f); // OR
assert((value ^ bitmask) == 0x2d); // XOR
assert((value << 4) == 0x220); // Shift left
assert((value >> 4) == 0x02); // Shift right
Dart에는 if-else 문이 필요할 수있는 표현식을 간결하게 평가할 수있는 두 개의 연산자가 있습니다.
condition ? expr1 : expr2
조건이 참이면 expr1
을 평가하고 그 값을 반환합니다. 그렇지 않으면 expr2
의 값을 평가하고 반환합니다.
expr1 ?? expr2
expr1
이 null
이 아니면 값을 리턴합니다. 그렇지 않으면 expr2
의 값을 평가하고 반환합니다.
부울 표현식을 기반으로 값을 할당해야하는 경우 ? ~ :
사용을 고려하십시오.
var visibility = isPublic ? 'public' : 'private';
부울식이 null
을 테스트하는 경우 ??
를 사용하는 것이 좋습니다.
String playerName(String name) => name ?? 'Guest';
위 예제는 적어도 두 가지 다른 방법으로 작성되었을 수 있지만 간결하지는 않습니다.
// Slightly longer version uses ?: operator.
String playerName(String name) => name != null ? name : 'Guest';
// Very long version uses if-else statement.
String playerName(String name) {
if (name != null) {
return name;
} else {
return 'Guest';
}
}
(..)
캐스케이드 (..)
를 사용하면 동일한 개체에서 일련의 작업을 수행 할 수 있습니다. 함수 호출 외에도 동일한 객체의 필드에 액세스 할 수 있습니다. 이것은 종종 임시 변수를 만드는 단계를 절약하고 더 유동적 인 코드를 작성할 수있게합니다.
아래 코드를 보면,
querySelector('#confirm') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
첫 번째 메서드 호출 인 querySelector()
는 선택기 객체를 반환합니다. 계단식 표기법을 따르는 코드는 반환 될 수있는 모든 후속 값을 무시하고이 선택기 개체에서 작동합니다.
위 예시는 다음과 같습니다.
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: method 'write' isn't defined for 'void'.
sb.write()
호출은 void
를 반환하며 void
에 계단식을 구성할 수 없습니다.
엄밀히 말해서 캐스케이드에 대한 "이중 점" 표기법은 연산자가 아닙니다. Dart 구문의 일부 일 뿐입니다.
다른 예시에서 나머지 연산자의 대부분을 확인했습니다.
.
, ?.
및 ..
연산자에 대한 자세한 내용은 클래스를 참조하십시오.