로또 번호 출력
당첨 번호와 번호 자동 생성기(5가지 출력) 2가지의 기능으로 당첨 번호와 자동 생성된 번호 중 일치하는 번호는 노란색으로 표시하는 프로그램이다.
어려워서 정답 코드를 보고 공부하려고 한다. 공부해서 안보고 쳐봐야지..

코드의 전체적인 구조는
1. 6자리로 된 1 ~ 45까지의 랜덤 숫자를 오름차순으로 출력하는 함수
2. 1번에서 출력된 번호와 당첨 배열의 번호를 받아 css추가하고 HTML로 출력하는 함수
3. 당첨 버튼 눌렀을 때 함수
4. 번호자동생성 버튼 눌렀을 때 함수
4가지 함수로 정리된다.
당첨버튼 눌렀을 때 번호 출력 함수를 실행시켜 HTML출력 함수에 넣어 화면 호출시키고
번호자동생성 버튼 눌렀을 때 번호 출력 함수를 실행시켜 HTML출력 함수에 넣어 화면 호출시키는 구조이다.
HTML출력 함수는 매개변수를 출력된 번호, 당첨 번호 2가지로 받아 상황에 맞게 css를 추가하든 하지 않든 한다.
노드 객체 변수 선언
const generateWinningNumbers = document.getElementById(
'generateWinningNumbers'
);
const generateLottoNumbers = document.getElementById('generateLottoNumbers');
const winningNumContainer = document.getElementById('winningNumbers');
const lottoNumContainer = document.getElementById('lottoNumbers');
번호 출력 함수
function generateNumbers() {
let numbers = [];
while (numbers.length < 6) {
let number = Math.floor(Math.random() * 45) + 1;
if (!numbers.includes(number)) {
numbers.push(number);
}
}
return numbers.sort((a, b) => a - b);
}
sort로 오름차순하는 함수는 잘 모르는 메소드라 알아보았다.
처음엔 sort()로 적용해주고 끝인 줄 알았으나 비교 함수를 넣어야한다고 한다.
비교함수를 임시로 a, b라고 잡아주고 a에서 b를 뺐을 때 0보다 작을 경우 a, b순으로 정렬되고 그 반대이면 반대로 정렬된다고 한다.
HTMl 출력 함수
function displayNumbers(numbers, winningNumbers = []) {
const numSetElement = document.createElement('div');
numSetElement.classList.add('number-set');
numbers.forEach((number) => {
const numElement = document.createElement('span');
numElement.classList.add('number');
if (winningNumbers.includes(number)) {
numElement.classList.add('match');
}
numElement.textContent = number;
numSetElement.appendChild(numElement);
});
return numSetElement;
}
어려웠던 함수.. 사실상 매개변수가 1개인지 2개인지에 따라 if문 비교를 통해 css가 추가될 지 안될지 정하는 것이다.
당첨번호 버튼 누르면? 함수
let winningNumbers = [];
generateWinningNumbers.addEventListener('click', () => {
winningNumbers = generateNumbers();
winningNumContainer.innerHTML = '';
winningNumContainer.appendChild(displayNumbers(winningNumbers));
});
번호 자동 생성 버튼 누르면? 함수
generateLottoNumbers.addEventListener('click', () => {
if (winningNumbers.length !== 0) {
lottoNumContainer.innerHTML = '';
for (let i = 0; i < 5; i++) {
const lottoNumbers = generateNumbers();
lottoNumContainer.appendChild(
displayNumbers(lottoNumbers, winningNumbers)
);
}
} else {
alert('당첨 번호를 먼저 생성하세요.');
}
이렇게 하여 먼저 당첨번호 버튼을 눌러 당첨 번호를 출력한 뒤 자동번호생성 버튼을 눌러 5개의 자동생성된 번호(당첨번호와 일치하는 숫자는 노란색 표시)를 출력하는 프로그램이 완성됐다.
4개의 함수 블록을 만들어 필요할 때 호출하고 전달되는 매개변수의 수를 조절하여 if문으로 조절하는 로직이었다.
회고: 어려웠다.. 안보고 다시 풀어봤는데 1시간 10분 걸렸다. 가장 오래걸린 부분은 번호 자동 생성 버튼 함수 클릭한다면? 함수였다. 5번 번호를 출력시키는 부분이 어려웠고 lottoNumbers 변수에 5개의 배열이 동시에 들어간다고 착각해서 헤맸다.
동시에 들어가는게 아니라 5개가 순서대로 촤촥 만들어지고 빠지고 하는거였는데!
HTML함수의 매개변수 2가지 받는 부분이 이해하기 시간이 좀 걸렸다. 복잡하게 느껴지는 코드가 사실 4개의 함수를 적절히 연결하여 사용하는 로직이었다고 생각하니 정리가 되는 느낌이다.
앞으로 복잡하게 느껴지는 기능이더라도 천천히 1개 혹은 2개씩의 기능을 가진 함수로 만들어 정리하면 코드 짜기 쉬워질 것 같다.