Dart Language Tour #4

t0dd·2020년 9월 1일
0

Dart Language Tour

목록 보기
4/6
post-thumbnail

연산자

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 + aPointVector 버전의 +를 사용합니다.

산술연산자

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

평등 및 관계 연산자

다음 표에는 같음 및 관계 연산자의 의미가 나열되어 있습니다.

두 객체 xy가 같은 것을 나타내는 지 테스트하려면 == 연산자를 사용하십시오. (드물게 두 객체가 정확히 동일한 객체인지 알아야하는 경우에는 대신 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의 결과는 Ttrue입니다. 예를 들어 obj is Object가 항상 true입니다.

객체가 해당 유형인지 확신하는 경우에만 as 연산자를 사용하여 객체를 특정 유형으로 캐스트하십시오.

(emp as Person).firstName = 'Bob';

개체가 T 유형인지 확실하지 않은 경우 개체를 사용하기 전에 is T를 사용하여 유형을 확인합니다.

if (emp is Person) {
  // Type check
  emp.firstName = 'Bob';
}

코드가 동일하지 않습니다. empnull이거나 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

expr1null이 아니면 값을 리턴합니다. 그렇지 않으면 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 구문의 일부 일 뿐입니다.

기타 연산자

다른 예시에서 나머지 연산자의 대부분을 확인했습니다.

., ?... 연산자에 대한 자세한 내용은 클래스를 참조하십시오.

profile
Javascript로 많은 것을 쉽고 빠르고 재밌게 만드는 것을 좋아합니다.

0개의 댓글