[Dart] .. 뜻? Cascade notation. (cascade operator)

다트에서 ..의 뜻에 대해 알아보도록 합시다~

아래 코드는 Dart에서 리스트를 셔플(shuffle)하고 첫 번째 요소를 가져오는 기능을 간결하게 구현한 방식입니다. 

final List<Map<String, String>> categories = [];
Map<String, String>? selectedCategory;
selectedCategory = (categories..shuffle()).first;

코드의 의미

  1. categories..shuffle():
    • categories 리스트를 무작위로 섞음.
    • ..는 cascade operator로, shuffle()을 호출하면서 categories 자체를 반환합니다.
  2. .first:
    • 섞인 리스트의 첫 번째 요소를 가져옴.

동작 방식

이 코드는 categories 리스트를 셔플한 후 첫 번째 항목만 선택합니다. 결과적으로 selectedCategory에는 무작위로 섞인 리스트의 첫 번째 항목이 저장됩니다.

캐스케이드 노테이션 사용 이유

  • 효율성:
    • shuffle()은 리스트를 무작위로 섞는 간단한 알고리즘입니다. 매우 가볍게 동작하므로 앱 성능에 큰 영향을 주지 않습니다.
  • 랜덤 동작 보장:
    • 단순히 랜덤 인덱스를 사용하는 대신 리스트 전체를 섞으므로 더 간단하고 유지보수에 용이.

넣지 않아도 된다면?

대안으로 특정 항목만 랜덤으로 선택하는 방식도 가능합니다.

final random = Random();
selectedCategory = categories[random.nextInt(categories.length)];

도움말

categories..shuffle()는 간결하고 유지보수에 유리하므로 현재와 같은 간단한 앱에서는 적합합니다.
하지만, 만약 코드 가독성을 위해 더 명확한 방식을 원한다면 위의 Random을 사용하는 방식으로 변경할 수도 있습니다. 😊

..과 . 차이

..과 . 차이에 대해 알아보도록 합시다. ...(Spread operator)은 다른 글에서 다루도록 할게요.

(categories..shuffle()).first

  • 의미:
    • Cascade operator (..)를 사용해, categories 리스트를 무작위로 섞고, 원본 리스트를 반환합니다.
    • 따라서 categories 자체가 섞인 상태로 유지됩니다.
  • 결과:
    • 리스트 자체를 변경하고 그 상태에서 첫 번째 요소를 가져옵니다.

(categories.shuffle()).first

  • 의미:
    • categories.shuffle()void를 반환합니다(반환값이 없음).
    • 따라서 컴파일 에러가 발생합니다.
  • 이유:
    • shuffle() 메서드는 원본 리스트를 섞기만 할 뿐 아무 값도 반환하지 않습니다.
    • Cascading (..)를 사용하지 않으면 리스트의 요소를 가져올 수 없습니다.

올바른 코드

  1. Cascade Operator를 유지:
    selectedCategory = (categories..shuffle()).first;
    
    • categories 리스트를 섞고 첫 번째 요소를 선택합니다.
  2. 다른 방식(인덱스 활용):
    final random = Random();
    selectedCategory = categories[random.nextInt(categories.length)];
    
    • 리스트를 섞지 않고 무작위 인덱스를 선택합니다.

결론

categories..shuffle()은 원본 리스트를 섞고 반환하므로 올바르게 동작하지만, categories.shuffle()는 반환값이 없기 때문에 직접 사용할 수 없습니다. 따라서 ..을 사용하는 방식이 필요합니다. 😊

댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗