배경
도전 과제 3에서 중복 없는 로또 번호를 생성해야 했다.
이를 위해 Dart의 dart:math 라이브러리에서 제공하는 Random().nextInt()를 사용했다.
- Random().nextInt(45) + 1 → 1부터 45까지 난수 생성.
발단
처음에는 로또 번호를 리스트(List<int>)에 담으려 했지만, 중복된 값이 들어올 수 있다는 문제가 있었다.
이를 방지하기 위해 Set을 사용하기로 했다.
전개
Set<int>는 중복을 허용하지 않으므로, while (lotto.length < 6) 조건을 이용해 6개의 고유한 번호를 뽑았다.
그러나 새로운 문제가 생겼다. Set은 순서를 보장하지 않기 때문에, 결과가 매번 뒤죽박죽 출력되었다.
위기
출력할 때마다 순서가 달라 사용자가 보기 불편했고, 단순히 중복만 해결해서는 완성도가 부족했다.
절정
이 문제를 해결하기 위해 Set을 List로 변환한 후 정렬을 적용했다.
- lotto.toList() → 순서 있는 리스트로 변환
- ..sort() → 오름차순 정렬
이 과정에서 난수 생성 범위도 다시 점검했다. 처음엔 nextInt(45)가 1~45라고 생각했는데, 다시 생각해보니 컴퓨터는 0부터 시작하기 때문에 0~44 범위였다. 로또에는 0번이 없으므로 +1을 해서 1~45 범위를 맞춘다는 점을 확실히 이해했다.
또한, 정렬 과정에서 ..sort() 문법이 생소해서, 단순히 .sort()와 뭐가 다른지 지피티에게 물어봤다. 그 결과, ..은 Cascade Operator로, 메서드 실행 후에도 원래 객체를 그대로 반환해 체이닝할 수 있다는 것을 알게 되었다. 즉, toList()..sort()는 변환과 동시에 정렬을 한 줄로 처리할 수 있는 간결한 문법이었다.
결말
최종적으로 로또 번호 생성 로직은 다음 단계로 정리되었다.
- Random().nextInt(45) + 1 → 1~45 난수 생성
- Set<int> → 중복 자동 제거
- lotto.toList() → 리스트로 변환
- ..sort() → 정렬된 결과 반환
이 과정을 거쳐 중복 문제, 순서 문제를 모두 해결했으며, +1의 의미와 ..sort() 문법까지 명확히 이해하게 되었다.
따라서 코드 품질을 개선했을 뿐 아니라, 유지·보수 및 확장성에도 유리한 구조를 마련할 수 있었다.