다트에서 ..의 뜻에 대해 알아보도록 합시다~
아래 코드는 Dart에서 리스트를 셔플(shuffle)하고 첫 번째 요소를 가져오는 기능을 간결하게 구현한 방식입니다.
final List<Map<String, String>> categories = [];
Map<String, String>? selectedCategory;
selectedCategory = (categories..shuffle()).first;
코드의 의미
categories..shuffle():categories리스트를 무작위로 섞음...는 cascade operator로,shuffle()을 호출하면서categories자체를 반환합니다.
.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자체가 섞인 상태로 유지됩니다.
- Cascade operator (
- 결과:
- 리스트 자체를 변경하고 그 상태에서 첫 번째 요소를 가져옵니다.
(categories.shuffle()).first
- 의미:
categories.shuffle()는void를 반환합니다(반환값이 없음).- 따라서 컴파일 에러가 발생합니다.
- 이유:
shuffle()메서드는 원본 리스트를 섞기만 할 뿐 아무 값도 반환하지 않습니다.- Cascading (
..)를 사용하지 않으면 리스트의 요소를 가져올 수 없습니다.
올바른 코드
- Cascade Operator를 유지:
selectedCategory = (categories..shuffle()).first;categories리스트를 섞고 첫 번째 요소를 선택합니다.
- 다른 방식(인덱스 활용):
final random = Random(); selectedCategory = categories[random.nextInt(categories.length)];- 리스트를 섞지 않고 무작위 인덱스를 선택합니다.
결론
categories..shuffle()은 원본 리스트를 섞고 반환하므로 올바르게 동작하지만, categories.shuffle()는 반환값이 없기 때문에 직접 사용할 수 없습니다. 따라서 ..을 사용하는 방식이 필요합니다. 😊
