숫자 목록을 맡긴 두 변수
AI에게 학생이 답을 낸 순서 [12, 3, 8]을 보여 주고, 작은 수부터 정렬한 목록도 만들어 달라고 합니다. 나중에 처음 답한 번호를 확인하려면 두 순서가 모두 필요합니다. 변수 이름 하나를 더 붙여 두면 충분할까요?
실습에서 sort와 숫자 오름차순을 선택하면 결과는 [3, 8, 12]입니다. ‘실행 후 원본’도 [3, 8, 12]가 됩니다. 자바스크립트의 sort()는 호출한 배열 안에서 순서를 바꾼 다음 같은 배열을 돌려줍니다. 결과에 새 이름을 붙여도 그 이름은 같은 배열을 가리킵니다.
원래 답한 순서를 남기는 방법
메서드를 toSorted로 바꾸어 보세요. 매번 같은 [12, 3, 8]에서 다시 시작합니다. 정렬한 결과는 앞선 실험과 같지만 이번에는 원본의 첫 값이 12로 남습니다. toSorted()가 새 배열에 정렬된 순서를 담아 돌려주기 때문입니다.
‘원본 === 결과’는 두 변수가 같은 배열을 가리키는지 확인하는 식입니다. sort()에서는 true, toSorted()에서는 false가 나옵니다. 숫자가 어느 순서로 보이는지와 그 숫자를 담은 배열이 같은지는 따로 확인할 수 있습니다.
12가 3보다 앞에 놓이는 까닭
비교 기준을 ‘기본 문자열 순서’로 바꾸면 [12, 3, 8]이 그대로 보입니다. 비교 함수를 생략하면 이 숫자들은 문자열로 비교됩니다. ‘12’의 첫 글자 ‘1’이 ‘3’보다 앞서므로 이미 그 기준에 맞는 순서입니다.
다시 숫자 오름차순을 고르면 비교 함수는 두 값의 차이를 사용합니다. 같은 입력이 [3, 8, 12]로 바뀝니다. 순서가 처음과 같았다는 관찰만으로 원본이 보호된다고 결론 내리기 어려운 까닭이 여기에 있습니다.
숫자 대신 학생 기록을 담으면
숫자 배열은 새 배열 하나로 처음 순서를 보관할 수 있습니다. 이제 각 칸에 학생의 이름과 점수가 든 기록을 넣었다고 생각해 보세요. toSorted()로 만든 두 배열은 순서를 따로 갖지만, 각 칸은 같은 학생 기록을 가리킬 수 있습니다.
따라서 원본의 순서를 보관하는 일과 원래 점수까지 별도로 보관하는 일에는 서로 다른 조치가 필요합니다. AI가 만든 코드를 살필 때에는 ‘무엇을 보존하려 했는가’를 먼저 적고 그 값이 정렬 뒤에도 남아 있는지 확인해 보세요.

