스타벅스 주문 시스템 만들기 (난이도 상)

<aside> 🔥

이 과제에서는 HTML, CSS, JavaScript를 사용하여 간단한 스타벅스 주문 시스템을 만드는 법을 배웁니다. 여러분은 HTML, CSS, JavaScript를 활용하여 기본 구조를 완성하고, 일부 로직을 직접 구현해보세요.

</aside>

Screen Recording 2024-09-09 at 3.38.33 AM.mov

1단계: 프로젝트 파일 구조 설정

먼저, 프로젝트를 시작하기 위해 기본 파일 구조를 설정합니다.

  1. 새 폴더 생성: 컴퓨터의 원하는 위치에 'starbucks-order-system'이라는 폴더를 만듭니다.
  2. 파일 생성: 아래와 같은 파일들을 폴더 안에 생성하세요.
    • index.html
    • styles.css
    • script.js

2단계: HTML 파일 만들기

이제 index.html 파일을 열고, 아래의 코드를 참고하여 HTML 구조를 완성해보세요. 링크 부분은 스스로 채워보세요.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>스타벅스 주문 시스템</title>
    <!-- 여기에 styles.css 파일을 로드하는 코드를 추가하세요 -->
</head>
<body>
    <h1>스타벅스 메뉴</h1>

    <div id="menu">
        <h2>메뉴</h2>
        <!-- 메뉴 아이템이 여기에 추가될 것입니다 -->
    </div>

    <div id="order-summary">
        <h2>주문 내역</h2>
        <ul id="order-list"></ul>
        <p>총 가격: ₩<span id="total-price">0</span></p>
        <button id="submit-order">주문 제출</button>
    </div>

    <!-- 여기에 script.js 파일을 로드하는 코드를 추가하세요 -->
</body>
</html>

3단계: CSS 파일 만들기

styles.css 파일에서 기본적인 스타일을 제공했습니다. 나머지 스타일은 스스로 작성해보세요.

body {
    font-family: Arial, sans-serif;
    padding: 20px;
    max-width: 600px;
    margin: 0 auto;
}

h1 {
    text-align: center;
}

/* 여기에 #menu와 #order-summary의 스타일을 추가하세요. */
/* 버튼과 관련된 스타일은 아래의 예시를 참고하여 완성하세요. */

button {
    background-color: #00704a;
    color: white;
    padding: 10px;
    border: none;
    border-radius: 5px;
    cursor: pointer;
}

button:hover {
    background-color: #005936;
}

4단계: JavaScript 파일 만들기

이제 script.js 파일을 열고, 아래의 코드를 참고하여 나머지 로직을 직접 구현해보세요.

document.addEventListener('DOMContentLoaded', () => {
    const menu = [
        { name: '아메리카노', price: 4100 },
        { name: '카페라떼', price: 4600 },
        { name: '카푸치노', price: 4600 },
        { name: '카라멜 마끼아또', price: 5800 },
        { name: '자바 칩 프라푸치노', price: 6300 },
        { name: '딸기 요거트 블렌디드', price: 6300 }
    ];

    let order = {};
    let totalPrice = 0;

    const menuContainer = document.getElementById('menu');
    const orderList = document.getElementById('order-list');
    const totalPriceElement = document.getElementById('total-price');
    const submitOrderButton = document.getElementById('submit-order');

    // TODO-1: 메뉴 아이템을 화면에 표시하는 코드를 작성하세요.
    // 힌트: menu 배열을 반복문(forEach)을 사용해 순회하며,
    
    // 각 메뉴 아이템을 div 요소로 생성한 후 menuContainer에 추가하세요.
    // div 요소 안에는 메뉴 이름과 가격을 표시하는 span 태그,
    // 그리고 '주문 추가' 버튼을 추가해야 합니다.
    
    // '주문 추가' 버튼에는 각 메뉴 아이템의 인덱스를 data-index 속성으로 저장하여,
    // 클릭 시 해당 메뉴를 식별할 수 있게 만드세요.

    // TODO-2: 주문 추가 로직을 작성하세요.
    // 힌트: menuContainer에 이벤트 리스너를 추가하고, 이벤트가 발생한 대상이 버튼인지 확인합니다.
    
    // 버튼의 data-index 속성을 이용해 어떤 메뉴가 클릭되었는지 파악한 후,
    // 해당 메뉴의 수량을 증가시키거나 새로 추가하세요.
    
    // 이후, 총 가격(totalPrice)을 업데이트하고,
    // 주문 목록을 업데이트하는 updateOrderList 함수를 호출하세요.

    // 예시 코드:
    // menu.forEach((item, index) => {
    //     // 각 메뉴 아이템에 대해 div 요소 생성 및 메뉴 아이템 추가
    // });

    // menuContainer.addEventListener('click', (event) => {
    //     if (event.target.tagName === 'BUTTON') {
    //         // 클릭된 버튼의 메뉴 아이템을 주문에 추가하는 로직 작성
    //     }
    // });
    
    // 주문 내역 업데이트 함수
    function updateOrderList() {
        orderList.innerHTML = '';
        for (let itemName in order) {
            const orderItem = order[itemName];
            const orderItemElement = document.createElement('li');
            orderItemElement.innerHTML = `
                ${itemName} - ₩${orderItem.price.toLocaleString()} x${orderItem.quantity}
                <button class="remove" data-item="${itemName}">삭제</button>
            `;
            orderList.appendChild(orderItemElement);
        }
        totalPriceElement.textContent = totalPrice.toLocaleString();
    }

    // 아이템 삭제 로직
    orderList.addEventListener('click', (event) => {
        const itemName = event.target.getAttribute('data-item');
        if (event.target.classList.contains('remove')) {
            totalPrice -= order[itemName].price * order[itemName].quantity;
            delete order[itemName];
            updateOrderList();
        }
    });

    // 주문 제출 로직
    submitOrderButton.addEventListener('click', () => {
        if (Object.keys(order).length > 0) {
            alert('주문해 주셔서 감사합니다!');
            order = {};
            totalPrice = 0;
            updateOrderList();
        } else {
            alert('주문 내역이 비어 있습니다!');
        }
    });
});

추가 설명:

  1. 메뉴 표시 힌트:
    • menu.forEach를 사용하여 각 메뉴 아이템을 순회하면서, document.createElement('div')를 통해 메뉴 아이템을 감쌀 div 요소를 생성합니다.
    • 생성된 div 안에 메뉴 이름과 가격을 표시할 span 요소를 추가하고, '주문 추가' 버튼을 생성하여 div에 추가합니다.
    • 마지막으로, 생성된 div를 menuContainer.appendChild를 통해 화면에 추가합니다.
  2. 주문 추가 로직 힌트:
    • menuContainer.addEventListener를 사용하여 클릭 이벤트를 감지하고, 클릭된 요소가 버튼인지 event.target.tagName을 통해 확인합니다.
    • 버튼의 data-index 속성을 활용하여, menu 배열에서 해당 메뉴를 가져오고, 이 메뉴가 이미 주문에 있는지 확인합니다.
    • 이미 주문에 있다면 order[menuItem.name].quantity += 1;로 수량을 증가시키고, 없다면 새로운 객체로 추가합니다.
    • 총 가격을 업데이트하고, updateOrderList() 함수를 호출하여 주문 목록을 갱신합니다.
  3. 나머지 로직들은 위에 구현해 놓은 것들을 그대로 쓰시면 됩니다. 지금은 ‘아..! 이렇게 구현이 되구나! 정도로 한번 보기만 해주세요!’

새 폴더 (2).zip
0.53MB

 

JavaScript 배열 고급 메서드 활용
 
  • `slice`, `splice`, `reverse` 메서드의 동작 방식을 이해하고, 이를 활용한 실습 예제를 작성하세요.
  • 예: 배열의 특정 구간을 잘라내거나, 특정 위치에 데이터를 삽입 및 삭제하는 로직 구현.

 

배열의 개념과 기본적인 생성 방법을 익히고, 데이터를 추가(push)하거나 제거(pop)하는 방법을 실습하세요.

 

요약

  • 첫 번째 매개변수: 배열의 요소 값 (예: item, number).
  • 두 번째 매개변수: 배열 요소의 인덱스 (예: index, idx).
  • 매개변수 이름은 자유롭게 지정 가능하지만, 순서는 반드시 지켜야 합니다. 😊

궁금한 점 있으면 또 물어보세요! ✨

 

  • 'for' 문을 사용하여 반복 작업을 처리하는 예제를 작성하세요.
  • 예: 1부터 100까지의 합을 계산하는 프로그램.

    calcuatedSum이라는 함수를 호출해서 console.log 에서 1부터 100까지의 합을 가져온경우.

 

console.log에서 함수호출없이 바로 출력할경우.

 

 

 

 

 

JavaScript에서 지원하는 데이터 타입은 크게 두 가지로 나눌 수 있습니다:

**기본형 (Primitive Type)**과 참조형 (Reference Type).

이 두 가지 타입은 메모리 관리 방식과 값 저장 방식에서 차이가 있습니다.

 

1. 기본형 (Primitive Type)

기본형 데이터 타입은 값 자체가 변수에 저장되는 데이터 타입입니다. 이 값들은 불변(immutable)하며, 변수에 할당된 값을 변경할 수 없습니다. 또한, 기본형은 비교 시 만을 비교합니다.

기본형 데이터 타입:

  • string: 문자열을 나타냅니다.
    • 예시: 'Hello, world!', "JavaScript"
    • 특징: 문자들의 집합이며, 불변(immutable)입니다. 즉, 문자열을 수정할 수 없습니다.
  • number: 숫자 값을 나타냅니다. 정수와 부동소수점을 모두 포함합니다.
    • 예시: 42, 3.14, -10
    • 특징: 숫자는 모두 IEEE 754 표준을 따르는 부동소수점 형식으로 저장됩니다.
    • 주의: NaN (Not a Number)과 Infinity, -Infinity 등의 특수한 숫자도 존재합니다.
  • boolean: 참(true) 또는 거짓(false)을 나타냅니다.
    • 예시: true, false
    • 특징: 논리값을 나타내며, 조건문에서 주로 사용됩니다.
  • undefined: 변수는 선언되었지만, 값이 할당되지 않은 상태를 나타냅니다.
    • 예시: let x; // x는 undefined
    • 특징: 변수는 선언되었지만 아직 값이 할당되지 않았을 때 자동으로 undefined 값이 됩니다.
  • null: 의도적인 빈 값을 나타냅니다. null은 객체가 없음을 명시적으로 나타내는 값입니다.
    • 예시: let y = null;
    • 특징: null은 "없음" 또는 "빈 값"을 의도적으로 할당할 때 사용되며, 객체가 아닌 원시 값입니다.
  • symbol: 고유하고 변경 불가능한 값을 생성하는 데이터 타입입니다. 주로 객체의 키로 사용됩니다.
    • 예시: let sym = Symbol('description');
    • 특징: 유일한 값을 생성하며, Symbol() 함수로 생성합니다. 다른 값들과 구별되는 고유한 값이기 때문에 주로 객체 프로퍼티의 고유 키를 만들 때 사용됩니다.
  • bigint: 큰 정수를 표현하는 데이터 타입입니다. JavaScript의 number 타입은 안전하게 표현할 수 있는 정수 범위가 제한적이지만, bigint를 사용하면 아주 큰 정수를 처리할 수 있습니다.
    • 예시: let big = 1234567890123456789012345678901234567890n;
    • 특징: 크기가 매우 큰 정수를 나타내며, 뒤에 n을 붙여서 선언합니다.
  • 2. 참조형 (Reference Type)참조형 데이터 타입:
    • object: 다양한 값을 속성으로 가질 수 있는 복합적인 데이터 타입입니다. 객체는 키-값 쌍으로 이루어집니다.
      • 예시:
        javascript
        코드 복사
        let person = { name: 'Alice', age: 30 };
      • 특징: 객체는 속성(property)을 가지며, 배열, 함수, 날짜 등 다양한 형태로 확장 가능합니다.
    • array: 배열은 객체의 한 종류로, 여러 값을 순서대로 저장할 수 있는 자료구조입니다.
      • 예시:
        javascript
        코드 복사
        let numbers = [1, 2, 3, 4];
      • 특징: 배열은 인덱스를 사용하여 값을 참조하며, 배열의 크기는 동적으로 변할 수 있습니다.
    • function: 함수도 객체로 취급됩니다. 함수는 일급 객체로, 변수에 할당하거나 다른 함수의 인자로 전달될 수 있습니다.
      • 예시:
        javascript
        코드 복사
        function greet(name) { return `Hello, ${name}!`; }
      • 특징: 함수는 호출 가능한 객체로, 인자를 받아서 결과를 반환할 수 있습니다.
  • 참조형 데이터 타입은 메모리 주소를 변수에 저장하는 데이터 타입입니다. 이 값들은 변경 가능(mutable)하며, 객체를 복사하거나 할당할 때 주소를 공유합니다.

3. 기본형 vs 참조형 차이점

특징기본형 (Primitive)참조형 (Reference)

값 저장 방식 자체가 변수에 저장됨 주소(참조)가 변수에 저장됨
메모리 관리 값이 복사되어 저장됨 주소가 복사되므로 객체를 공유함
변경 가능 여부 불변 (값을 변경할 수 없음) 변경 가능 (값을 수정할 수 있음)
비교 방법 을 비교 (예: a === b) 주소를 비교 (두 객체가 같은 주소를 가리키는지 확인)
예시 string, number, boolean, undefined, null, symbol, bigint object, array, function

 

 

결론:

  • 기본형 (Primitive Type): 값 자체가 저장되고, 변경할 수 없습니다. 비교 시 값만 비교합니다.
  • 참조형 (Reference Type): 주소가 저장되고, 변경할 수 있습니다. 비교 시 주소를 비교합니다.

이러한 차이점을 이해하는 것은 JavaScript에서 변수와 객체를 다룰 때 매우 중요합니다.

<aside> 📖 JavaScript에서 조건문을 활용하는 방법을 배우는 것이 목표입니다.

</aside>

💪🏻과제를 수행하고나 나면 할 수 있어요!

  • 반복문을 사용하는 방법을 이해할 수 있습니다.
  • 반복문을 사용하여 배열이나 문자열을 처리할 수 있습니다.

<aside> ⚡ Notification: 과제 시작 전 확인할 내용!

</aside>

✅ 과제 시작 전 다음 내용을 셀프 체크해보세요.

  • [ ] 변수를 선언할 수 있다.
  • [ ] 반복문의 조건을 제시할 수 있다.
  • [ ] console.log() 를 사용할 수 있다.
  • 🥚개념 한 판 요약
    • 반복문이란 무엇인가요?
      • 반복문은 특정 조건이 참인 동안 같은 코드를 여러 번 실행하는 구문입니다.
    • for 반복문
      • 주어진 횟수만큼 코드를 반복 실행합니다.
      • for (let i = 0; i < 5; i++) { console.log("Hello, World!"); }
    • while 반복문
      • 조건이 참인 동안 코드를 반복 실행합니다.
      • let count = 0; while (count < 5) { console.log("Counting: " + count); count++; }
    • do...while 반복문
      • 코드 블록을 먼저 실행한 후 조건을 검사하여, 조건이 참이면 계속 반복합니다.
      • let number = 0; do { console.log("Number: " + number); number++; } while (number < 5);
    • 중첩 반복문
      • 반복문 안에 또 다른 반복문을 포함하여 다차원 구조를 처리할 수 있습니다.
      • for (let i = 1; i <= 3; i++) { for (let j = 1; j <= 3; j++) { console.log(`i: ${i}, j: ${j}`); } }
    </aside>
  • <aside> 🐣 JavaScript 반복문 개념 한판 요약!

<aside> 🍀 본격적으로 시작해 볼까요?

 

1. 짝수만 출력하기

  • for 반복문을 사용하여 1부터 20까지의 숫자 중 짝수만 출력하세요.

<aside> 🔥 완료하셨다면?

</aside>

  • 전체코드를 복사하여 퀘스트로 제출해주세요
  • 데일리 퀘스트 👉 [ 링크 ] 를 클릭 하여 제출해주세요

 

20이하의 짝수만 출력한 경우

 

 

 

20이하의 짝수를 모두 더한 경우

 

20이하의 홀수를 모두 출력한 경우

 

 

 

20이하의 홀수를 모두 더한 경우

 

1. 기본 함수 선언과 호출

  • sayHello라는 이름의 함수를 선언하고, 이 함수는 "Hello, JavaScript!"라는 문장을 출력하게 하세요.
  • 함수를 호출하여 메시지가 출력되도록 하세요.

설명:

  • function sayHello()는 함수 선언입니다.
  • console.log("Hello, JavaScript!")는 함수가 호출되면 실행될 코드입니다.
  • sayHello();로 함수를 호출하여 "Hello, JavaScript!"가 출력되도록 했습니다.

 

2. 매개변수를 사용하는 함수

 

 

  • greetUser라는 이름의 함수를 선언하고, name이라는 매개변수를 받아서 "Hello, [name]!"을 출력하게 하세요.
  • 이 함수를 호출하여 자신의 이름을 넣어 출력해 보세요.

설명:

  • function greetUser(name)에서 name은 매개변수입니다. 이 함수는 호출할 때 name 값을 받아서 사용합니다.
  • greetUser("Alice")로 함수를 호출하고 "Alice"를 전달하면, "Hello, Alice!"가 출력됩니다.

 

3. 리턴 값을 가지는 함수

  • multiply라는 이름의 함수를 선언하고, 두 개의 숫자 a와 b를 매개변수로 받아서 그 곱을 반환하게 하세요.
  • 이 함수를 호출하여 임의의 두 숫자를 곱한 결과를 변수에 저장하고, 그 변수를 console.log()로 출력하세요.

 

 

 

  • function multiply(a, b)는 a와 b를 매개변수로 받아서 그 곱을 계산하고, return으로 결과값을 반환합니다.
  • let result = multiply(3, 5)는 두 숫자 3과 5를 전달하여 함수가 반환한 곱셈 결과를 result 변수에 저장합니다.
  • console.log(result)로 그 결과인 15를 출력합니다.

4. 여러 개의 매개변수를 사용하는 함수

  • calculateRectangleArea라는 함수를 선언하고, width와 height라는 두 매개변수를 받아 직사각형의 넓이를 반환하게 하세요.
  • 이 함수를 사용해 가로 5, 세로 10인 직사각형의 넓이를 계산하고 출력하세요.

 

설명:

  • function calculateRectangleArea(width, height)는 직사각형의 가로(width)와 세로(height)를 매개변수로 받아 넓이를 계산합니다.
  • let area = calculateRectangleArea(5, 10)는 가로 5, 세로 10을 전달하여 직사각형의 넓이인 50을 계산합니다.
  • console.log(area)로 그 결과를 출력합니다.

5. 기본 매개변수 값

  • greetWithDefault라는 함수를 선언하고, name 매개변수에 기본값을 "Guest"로 설정하여 "Hello, [name]!"을 출력하게 하세요.
  • 이 함수를 호출할 때 이름을 전달하지 않으면 "Hello, Guest!"가 출력되도록 하세요.

설명:

  • function greetWithDefault(name = "Guest")에서 name = "Guest"는 매개변수 name의 기본값을 설정하는 부분입니다.
    • 함수가 호출될 때 name 값을 전달하지 않으면 기본값 "Guest"가 사용됩니다.
  • greetWithDefault()는 이름을 전달하지 않으므로 "Hello, Guest!"가 출력됩니다.
  • greetWithDefault("Bob")은 "Bob"을 전달하여 "Hello, Bob!"이 출력됩니다.

 

 

2번 매개변수를 사용하는 함수에는 매개변수값을 변경할수있다.

예를들어 alice라고 넣고싶으면

 

 

 

5번 기본 매개변수 값

 

 

+ Recent posts