Dart 전개 연산자

Spread operators 전개 연산자 ......?

컬렉션 표현식을 평가한 뒤 컬렉션 내 모든 요소를펼쳐 꺼내 다른 컬렉션 리터럴(리스트, Set, Map)에 삽입합니다

연산자 표현식에 속하지 않으며 ......? 는 전통적인 의미의 연산자가 아닌 문법 설탕(Syntax Sugar)입니다

두 가지 종류로 나뉩니다

...collection:일반 전개. 컬렉션이 반드시 null이 아니어야 하며 null을 전달하면 즉시 오류가 발생합니다

...?collection:널 안전 전개. 컬렉션이 null일 경우 무시하고 예외를 발생시키지 않습니다

공식 예시 코드를 보면 쉽게 이해할 수 있습니다

void main() {
  final list1 = [1, 2, 3];
  final list2 = [0, ...list1, 4, 5];
  print(list2); // [0, 1, 2, 3, 4, 5]

  // 널 안전 전개
  List<int>? maybeList;
  final safeList = [10, ...?maybeList, 20];
  print(safeList); // [10, 20],maybeList가 null이어도 오류 없음
}Code language: Dart (dart)

위 예시는 두 개의 컬렉션으로 첫 번째 컬렉션은 1, 2, 3 세 요소입니다. 두 번째 컬렉션은 0 뒤에 첫 번째 컬렉션을 삽입하고 그 뒤에 4, 5를 추가해 최종적으로 [0, 1, 2, 3, 4, 5]가 됩니다

두 번째 예시도 삽입 처리지만 maybeList가 null이고 널 안전 전개를 사용했기 때문에 요소가 삽입되지 않고 결과에 영향을 주지 않으며 오류도 발생하지 않습니다

Set 예시

void main() {
	final set1 = {1, 2};
	final set2 = {3, ...set1, 4};
	print(set2); // {3, 1, 2, 4}
}Code language: PHP (php)

Map 예시

void main() {
	final map1 = {'a': 1, 'b': 2};
	final map2 = {'c': 3, ...map1, 'd': 4};
	print(map2); // {c: 3, a: 1, b: 2, d: 4}
}Code language: PHP (php)

주의점

[] {} 밖에서 단독으로 ... 를 사용할 수 없습니다

void main() {
    final list1 = [1, 2, 3];
	var arr = ...list; // 문법 오류, 컬렉션 리터럴 내부에서만 작성 가능
}Code language: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:12: Error: Expected an identifier, but got '...'.
Try inserting an identifier before '...'.
        var arr = ...list; // 문법 오류, 컬렉션 리터럴 내부에서만 작성 가능
                  ^^^
bin/firstdart.dart:3:12: Error: Expected ';' after this.
        var arr = ...list; // 문법 오류, 컬렉션 리터럴 내부에서만 작성 가능
                  ^^^
bin/firstdart.dart:3:15: Error: Undefined name 'list'.
        var arr = ...list; // 문법 오류, 컬렉션 리터럴 내부에서만 작성 가능Code language: PHP (php)

... 로 null을 직접 펼치면 런타임 오류가 발생합니다. null일 가능성이 있는 값은 반드시 ...? 를 사용해야 합니다

void main() {
	List<int>? list = null;
	var res = [...list]; // 오류 발생
	var resSafe = [...?list]; // 정상 작동
}Code language: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:16: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
        var res = [...list]; // 오류 발생Code language: PHP (php)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다