[TIL] 210929

Lee SyongΒ·2021λ…„ 9μ›” 29일
0

TIL

λͺ©λ‘ 보기
42/204
post-thumbnail

πŸ“ 였늘 ν•œ 것

  1. false / if ꡬ문 / && μ—°μ‚°μž / 빈 였브젝트 / class / 콜백 ν•¨μˆ˜

  2. λ‹Ήκ·Ό 클릭 κ²Œμž„ κ΅¬ν˜„ 쀑


πŸ“– ν•™μŠ΅ 자료

  1. λ“œλ¦Όμ½”λ”© 유튜브 'μžλ°”μŠ€ν¬λ¦½νŠΈ κΈ°λ³Έ 1 ~ 4편'

  2. λ“œλ¦Όμ½”λ”© 'ν”„λ‘ νŠΈμ—”λ“œ ν•„μˆ˜ λΈŒλΌμš°μ € 101' κ°•μ˜


πŸ“š 배운 것

λ“œλ¦Όμ½”λ”© 유튜브 μžλ°”μŠ€ν¬λ¦½νŠΈ κΈ°λ³Έ (3 ~ 4편) μ°Έκ³ 

1. μžλ°”μŠ€ν¬λ¦½νŠΈ 이둠 보좩

1) false / if ꡬ문 / && μ—°μ‚°μž / 빈 였브젝트

  • μ˜€λΈŒμ νŠΈκ°€ 값을 κ°€μ§€λŠ” 경우
let obj = { // objκ°€ 값을 κ°€μ§€λ―€λ‘œ
  name: 'ellie'
};

if (obj) { // true이기 λ•Œλ¬Έμ—
  console.log(obj.name); // console 창에 ellieκ°€ 좜λ ₯됨
}

// πŸ’‘ κ·ΈλŸ¬λ‚˜ μœ„μ²˜λŸΌ μ“°λŠ” 것보닀 μ•„λž˜μ²˜λŸΌ μ“°λŠ” 게 더 μ’‹λ‹€

obj && console.log(obj.name); // λ§ˆμ°¬κ°€μ§€λ‘œ ellieκ°€ 좜λ ₯됨
  • 빈 였브젝트인 경우
let obj = {}; // λ³€μˆ˜ obj에 빈 μ˜€λΈŒμ νŠΈλ”λΌλ„ 값은 ν• λ‹Ήλœ μƒνƒœ

if (obj) { // 빈 μ˜€λΈŒμ νŠΈλ„ κ·Έ 자체둜 true이기 λ•Œλ¬Έμ—
  console.log(obj.name); // console 창에 undefinedκ°€ '좜λ ₯됨'
}

obj && console.log(obj.name); // λ§ˆμ°¬κ°€μ§€λ‘œ undefinedκ°€ 좜λ ₯됨
  • μ•„μ˜ˆ λ³€μˆ˜μ— 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ€ 경우
let obj; // λ³€μˆ˜ obj에 μ–΄λ–€ 값도 ν• λ‹Ήλ˜μ§€ μ•Šμ•˜κΈ°μ— undefined

if (obj) { // undefinedλŠ” falseμ΄λ―€λ‘œ
  console.log(obj.name); // console.logκ°€ μ‹€ν–‰λ˜μ§€ μ•Šμ•„ console 창에 아무것도 '좜λ ₯λ˜μ§€ μ•ŠμŒ'
}

obj && console.log(obj.name); // λ§ˆμ°¬κ°€μ§€λ‘œ 아무것도 좜λ ₯λ˜μ§€ μ•ŠμŒ

2) class와 콜백 ν•¨μˆ˜

// class μ„ μ–Έ
class Counter {
  constructor () {
    this.counter = 0;
  }

  increase () {
    this.counter++;
    console.log(this.counter);

    // counter λ³€μˆ˜κ°€ 5의 배수일 λ•Œλ§ˆλ‹€ console 창에 'λ©”λ‘±' 좜λ ₯
    if (this.counter % 5 === 0) {
      console.log('λ©”λ‘±');
    }
  }
}

// CounterλΌλŠ” classλ₯Ό μ΄μš©ν•΄ coolCounterλΌλŠ” 객체λ₯Ό λ§Œλ“¦
const coolCounter = new Counter();

coolCounter.increase(); // 1
coolCounter.increase(); // 2
coolCounter.increase(); // 3
coolCounter.increase(); // 4
coolCounter.increase();
// 5
// λ©”λ‘±

μ΄λ ‡κ²Œ μ“°λ©΄ if ꡬ문이 class μ•ˆμ— λ“€μ–΄κ°€ μžˆμ–΄μ„œ μˆ˜μ •μ΄ μ–΄λ ΅λ‹€.
이와 같은 κ²½μš°μ— 콜백 ν•¨μˆ˜(λ‹€λ₯Έ ν•¨μˆ˜μ— 인자둜 λ“€μ–΄κ°€λŠ” ν•¨μˆ˜)λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

class Counter {
  constructor () {
    this.counter = 0;
  }
  
  // increase λ©”μ„œλ“œμ˜ 인자둜 ν•¨μˆ˜λ₯Ό λ„£μ–΄μ€Œ
  increase (runIf5Times) {
    this.counter++;
    console.log(this.counter);

    if (this.counter % 5 === 0) {
      runIf5Times(); // console.log('λ©”λ‘±'); λŒ€μ‹  써쀌
    }
  }
}

const coolCounter = new Counter();


// increase λ©”μ„œλ“œμ˜ 인자둜 printSomething ν•¨μˆ˜λ₯Ό λ„£μ–΄μ€Œ
function printSomething () {
  console.log('λ©”λ‘±');
}
coolCounter.increase(printSomething);
coolCounter.increase(printSomething);
coolCounter.increase(printSomething);
coolCounter.increase(printSomething);
coolCounter.increase(printSomething);
// μœ„μ™€ 같은 κ²°κ³Όκ°€ λœ¬λ‹€

콜백 ν•¨μˆ˜μ—λ„ 인자λ₯Ό 전달할 수 μžˆλ‹€.

class Counter {
  constructor () {
    this.counter = 0;
  }

  increase (runIf5Times) {
    this.counter++;
    console.log(this.counter);

    if (this.counter % 5 === 0) {
      runIf5Times(this.counter); // this.counterλ₯Ό 써쀌
    }
  }
}

const coolCounter = new Counter();

function printSomething (num) { // 콜백 ν•¨μˆ˜μ— 인자λ₯Ό λ„£μ–΄μ€Œ
  console.log(`λ©”λ‘± ${num}`);
}

coolCounter.increase(printSomething); // 1
coolCounter.increase(printSomething); // 2
coolCounter.increase(printSomething); // 3
coolCounter.increase(printSomething); // 4
coolCounter.increase(printSomething);
// 5
// λ©”λ‘± 5

class에 미리 μ •μ˜ν•΄λ†“λŠ” 게 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— κ·Έλ•Œκ·Έλ•Œ λ‹€λ₯Έ 콜백 ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ 인자둜 μ „ν•΄μ€ŒμœΌλ‘œμ¨ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

class Counter {
  constructor () {
    this.counter = 0;
  }

  increase (runIf5Times) {
    this.counter++;
    console.log(this.counter);

    if (this.counter % 5 === 0) {
      runIf5Times(this.counter);
    }
  }
}

const coolCounter = new Counter();

// alertNumμ΄λΌλŠ” 콜백 ν•¨μˆ˜λ₯Ό μƒˆλ‘œ λ§Œλ“¦
function alertNum (num) {
  alert(`μš°μ™€ ${num}`);
}

coolCounter.increase(printSomething);
coolCounter.increase(printSomething);
coolCounter.increase(printSomething);
coolCounter.increase(printSomething);
coolCounter.increase(alertNum);

κ·ΈλŸ¬λ‚˜ μ΄λ ‡κ²Œ ν•˜λ©΄ 맀번 coolCounter 객체의 increase λ©”μ„œλ“œμ— 콜백 ν•¨μˆ˜λ₯Ό μ¨μ€˜μ•Ό ν•΄μ„œ λ²ˆκ±°λ‘­λ‹€.
이 λ¬Έμ œλŠ” μ• μ΄ˆμ— class둜 객체λ₯Ό λ§Œλ“€ λ•Œ μƒμ„±μž(coustructor) ν•¨μˆ˜μ— μ›ν•˜λŠ” 콜백 ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•¨μœΌλ‘œμ¨ ν•΄κ²°ν•  수 μžˆλ‹€.

class Counter {
  constructor (runEveryFiveTimes) { // 1. μƒμ„±μž ν•¨μˆ˜μ— λ§€κ°œλ³€μˆ˜λ₯Ό μ μ–΄μ€Œ
    this.counter = 0;
    this.callBack = runEveryFiveTimes; // 2. 객체의 callBackμ΄λž€ 속성에 λ§€κ°œλ³€μˆ˜λ₯Ό 할당함
  }

  increase () {
    this.counter++;
    console.log(this.counter);

    if (this.counter % 5 === 0) {
      this.callBack(this.counter);
      // 5. this.callBack에 ν• λ‹Ήλ˜μ–΄ μžˆλŠ” printSomething ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λΌλŠ” 뜻
      // 6. 이 ν•¨μˆ˜κ°€ 싀행될 λ•ŒλŠ” this.counterκ°€ 인자둜 듀어감
    }
  }
}

// 3. printSomethingμ΄λž€ 콜백 ν•¨μˆ˜λ₯Ό 선언함
function printSomething (num) {
  console.log(`μš°μ™€ ${num}`);
}

const printCounter = new Counter(printSomething);
// 4. κ·Έ λ§€κ°œλ³€μˆ˜λŠ” printSomethingμ΄λž€ 것인데, μ΄λŠ” μ•žμ—μ„œ μ •μ˜ν–ˆλ‹€μ‹œν”Ό ν•¨μˆ˜μž„

coolCounter.increase();
coolCounter.increase();
coolCounter.increase();
coolCounter.increase();
coolCounter.increase();
// 7. coolCounter 객체의 increase λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•΄ this.counterκ°€ 5의 λ°°μˆ˜κ°€ 되면
// κ·Έλ•Œμ˜ this.counterλ₯Ό 인자둜 κ°€μ§€λŠ” printSomething ν•¨μˆ˜κ°€ 싀행됨

// 8. alertNumμ΄λΌλŠ” 또 λ‹€λ₯Έ 콜백 ν•¨μˆ˜λ₯Ό μ„ μ–Έν•΄ 같은 μˆœμ„œλ₯Ό κ±°μΉ  수 있음
function alertNum (num) {
  alert(`μš°μ™€ ${num}`);
}

// πŸ’‘ CounterλΌλŠ” ν•˜λ‚˜μ˜ classλ₯Ό μ΄μš©ν•΄ μ„œλ‘œ λ‹€λ₯Έ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” λ‹€μ–‘ν•œ 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€
// β†’ class의 μž¬μ‚¬μš© κ°€λŠ₯μ„± ↑
const alertCounter = new Counter(alertNum);

coolCounter2.increase();
coolCounter2.increase();
coolCounter2.increase();
coolCounter2.increase();
coolCounter2.increase();

μœ„μ˜ κ²½μš°μ—λŠ” CounterλΌλŠ” classλ₯Ό μ΄μš©ν•΄ coolCounterλΌλŠ” 객체λ₯Ό λ§Œλ“€ λ•Œ λ”°λ‘œ 콜백 ν•¨μˆ˜λ₯Ό 등둝해쀀 κ²½μš°μ΄λ‹€.

κ·ΈλŸ¬λ‚˜, λ§Œμ•½ 콜백 ν•¨μˆ˜λ₯Ό 등둝해주지 μ•Šμ•˜λ‹€λ©΄ this.callBack은 undefined 값을 κ°–κ²Œ λœλ‹€.

μ΄λ ‡κ²Œ 되면 μœ„μ˜ if κ΅¬λ¬Έμ—μ„œ ν•¨μˆ˜κ°€ μ•„λ‹Œ this.callBack을, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ“―μ΄ ν˜ΈμΆœν•΄λ²„λ¦° 것이 λ˜μ–΄, this.callBack은 ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌλŠ” typeErrorκ°€ 뜨게 λœλ‹€.

λ”°λΌμ„œ, 이런 μ—λŸ¬μ˜ λ°œμƒμ„ 막기 μœ„ν•΄μ„œλŠ” λ“±λ‘λœ 콜백 ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ μ—†λŠ”μ§€(this.callBack이 undefined인지 μ•„λ‹Œμ§€)λ₯Ό ν™•μΈν•œ ν›„ μ „μžμΌ λ•Œλ§Œ 콜백 ν•¨μˆ˜λ₯Ό λΆ€λ₯΄λ„둝 ν•΄μ•Ό ν•œλ‹€.

이λ₯Ό μœ„ν•΄ increase() λ©”μ„œλ“œμ˜ μ½”λ“œ λΈ”λŸ­μ„ μ•„λž˜μ™€ 같이 μˆ˜μ •ν•΄μ€„ 수 μžˆλ‹€.

increase() {
  this.counter++;
  console.log(this.counter);

  if (this.callBack) {
    this.counter % 5 === 0 && this.callBack(this.counter);
}

2. μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€μ „

1) λ‹Ήκ·Ό 클릭 κ²Œμž„ λ§Œλ“€κΈ°

πŸ“Œ κ΅¬ν˜„ λ‚΄μš© μͺΌκ°œκΈ°

  1. 초기 화면에 보여야 ν•  것듀

1) κ²Œμž„ μ‹œμž‘ λ²„νŠΌ
2) 타이머 (0:0이라고 μ ν˜€ 있음)
3) 클릭 κ°€λŠ₯ 횟수 (0이라고 μ ν˜€ 있음)

  1. κ²Œμž„ μ‹œμž‘ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄

1) ν•„λ“œ μ•ˆμ— λ‹Ήκ·Ό 10개과 벌레 7λ§ˆλ¦¬κ°€ λžœλ€ν•œ μœ„μΉ˜μ— λ°°μΉ˜λ˜μ–΄μ•Ό ν•œλ‹€.
2) 타이머가 μž‘λ™ν•΄μ•Ό ν•œλ‹€. (10μ΄ˆλΆ€ν„° μ‹œμž‘)
3) 클릭 κ°€λŠ₯ νšŸμˆ˜κ°€ 10으둜 λ°”λ€Œμ–΄μ•Ό ν•œλ‹€.
4) bg.mp3 배경음이 μž¬μƒλ˜μ–΄μ•Ό ν•œλ‹€.
5) κ²Œμž„ μ‹œμž‘ λ²„νŠΌ μ•ˆμ˜ μ•„μ΄μ½˜μ΄ 쀑지 μ•„μ΄μ½˜μœΌλ‘œ λ°”λ€Œμ–΄μ•Ό ν•œλ‹€.

  1. 당근을 ν΄λ¦­ν•˜λ©΄

1) carrot_pull.mp3 효과음이 λ“€λ €μ•Ό ν•œλ‹€.
2) 클릭 κ°€λŠ₯ νšŸμˆ˜κ°€ 1μ”© 쀄어듀어야 ν•œλ‹€.
3) 클릭된 당근이 ν™”λ©΄μ—μ„œ 사라져야 ν•œλ‹€.

  1. 벌레λ₯Ό ν΄λ¦­ν•˜λ©΄

1) bg.mp3 배경음이 λ©ˆμΆ°μ•Ό ν•œλ‹€.
2) bug_pull.mp3 효과음이 λ“€λ €μ•Ό ν•œλ‹€.
3) 타이머가 λ©ˆμΆ°μ•Ό ν•œλ‹€.
4) κ²Œμž„ μ‹œμž‘ λ²„νŠΌμ΄ μ—†μ–΄μ Έμ•Ό ν•œλ‹€.
5) YOU LOST 문ꡬ와 ν•¨κ»˜ μž¬μ‹œμž‘ λ²„νŠΌμ΄ λ– μ•Ό ν•œλ‹€.

  1. μ œν•œ μ‹œκ°„ 내에 λͺ¨λ“  당근을 ν΄λ¦­ν•˜λ©΄

1) bg.mp3 배경음이 λ©ˆμΆ°μ•Ό ν•œλ‹€.
2) game_win.mp3 μŒμ•…μ΄ μž¬μƒλ˜μ–΄μ•Ό ν•œλ‹€.
3) 타이머가 λ©ˆμΆ°μ•Ό ν•œλ‹€.
4) κ²Œμž„ μ‹œμž‘ λ²„νŠΌμ΄ μ—†μ–΄μ Έμ•Ό ν•œλ‹€.
5) YOU WON 문ꡬ와 ν•¨κ»˜ μž¬μ‹œμž‘ λ²„νŠΌμ΄ λ– μ•Ό ν•œλ‹€.

  1. μ œν•œ μ‹œκ°„ 내에 λͺ¨λ“  당근을 ν΄λ¦­ν•˜μ§€ λͺ»ν•˜λ©΄

1) bg.mp3 배경음이 λ©ˆμΆ°μ•Ό ν•œλ‹€.
2) κ²Œμž„ μ‹œμž‘ λ²„νŠΌμ΄ μ—†μ–΄μ Έμ•Ό ν•œλ‹€.
3) YOU LOST 문ꡬ와 ν•¨κ»˜ μž¬μ‹œμž‘ λ²„νŠΌμ΄ λ– μ•Ό ν•œλ‹€.

  1. κ²Œμž„ 쀑지 λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄

1) bg.mp3 배경음이 λ©ˆμΆ°μ•Ό ν•œλ‹€.
2) alert.wav 효과음이 λ“€λ €μ•Ό ν•œλ‹€.
3) 타이머가 λ©ˆμΆ°μ•Ό ν•œλ‹€.
4) κ²Œμž„ μ‹œμž‘ λ²„νŠΌμ΄ μ—†μ–΄μ Έμ•Ό ν•œλ‹€.
5) REPLAY 문ꡬ와 ν•¨κ»˜ μž¬μ‹œμž‘ λ²„νŠΌμ΄ λ– μ•Ό ν•œλ‹€.

  1. μž¬μ‹œμž‘ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄

1) 이전 κ²Œμž„μ˜ λ‹Ήκ·Όκ³Ό λ²Œλ ˆκ°€ μ—†μ–΄μ Έμ•Ό ν•œλ‹€.
2) replay ❓ 창이 μ—†μ–΄μ Έμ•Ό ν•œλ‹€.
3) λ‹€μ‹œ 2.κ°€ μΌμ–΄λ‚˜μ•Ό ν•œλ‹€. - (1), (3)만
4) 타이머가 'λ‹€μ‹œ μ²˜μŒλΆ€ν„°' μž‘λ™ν•΄μ•Ό ν•œλ‹€.
5) bg.mp3 배경음이 'λ‹€μ‹œ μ²˜μŒλΆ€ν„°' μž¬μƒλ˜μ–΄μ•Ό ν•œλ‹€.
6) κ²Œμž„ μ‹œμž‘ λ²„νŠΌμ΄ λ‹€μ‹œ 보여야 ν•œλ‹€.


(1) 첫 번째 μš”κ΅¬ 사항

초기 화면에 보여야 ν•  것듀

  • κ²Œμž„ μ‹œμž‘ λ²„νŠΌ
  • 타이머 (00:00이라고 μ ν˜€ 있음)
  • 클릭 κ°€λŠ₯ 횟수 (0이라고 μ ν˜€ 있음)

πŸ“Œ HTML λ§ˆν¬μ—…

μΆ”ν›„ μˆ˜μ •

<html>
  <body>
    <div class="setting">
      <button class="setting-startBtn" type="button"><i class="fas fa-play"></i></button>
      <div class="setting-timer">00:00</div>
      <div class="setting-limit">0</div>
    </div>
    <div class="field"></div>
  </body>
</html>

πŸ“Œ CSS μŠ€νƒ€μΌλ§

μΆ”ν›„ μˆ˜μ •

  • background: color image_url attatchment position / size;
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

button {
  border: 5px solid black;
  border-radius: 20px;
  background-color: wheat;
  width: 100px;
  height: 100px;
}

html {
  width: 100%;
  height: 100%;
}

body {
  background: url("img/background.png") no-repeat center / cover;
}

.setting {
  height: 450px;
}

.setting-startBtn {
  display: block;
  margin: 15px auto;
}

.setting-timer {
  border: 5px solid black;
  border-radius: 20px;
  background-color: white;
  width: 260px;
  height: 80px;
  margin: 15px auto;
  text-align: center;
  font-size: 2.5em;
  line-height: 1.3;
}

.fas {
  font-size: 40px;
}

.setting-limit {
  border: 4px solid black;
  border-radius: 50%;
  background-color: orange;
  width: 100px;
  height: 100px;
  margin: 10px auto;
  text-align: center;
  line-height: 1.5;
  font-size: 3em;
  font-weight: bold;
}

.field {
  height: calc(100vh - 450px);
}

(2) 두 번째 μš”κ΅¬ 사항

κ²Œμž„ μ‹œμž‘ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄

  • ν•„λ“œ μ•ˆμ— λ‹Ήκ·Όκ³Ό λ²Œλ ˆλ“€μ΄ λžœλ€ν•œ μœ„μΉ˜μ— λ°°μΉ˜λ˜μ–΄μ•Ό ν•œλ‹€.
  • 타이머가 μž‘λ™ν•΄μ•Ό ν•œλ‹€. (10μ΄ˆλΆ€ν„° μ‹œμž‘)
  • 클릭 κ°€λŠ₯ νšŸμˆ˜κ°€ 10으둜 λ°”λ€Œμ–΄μ•Ό ν•œλ‹€.
  • bg.mp3 배경음이 μž¬μƒλ˜μ–΄μ•Ό ν•œλ‹€.
  • κ²Œμž„ μ‹œμž‘ λ²„νŠΌ μ•ˆμ˜ μ•„μ΄μ½˜μ΄ 쀑지 μ•„μ΄μ½˜μœΌλ‘œ λ°”λ€Œμ–΄μ•Ό ν•œλ‹€.

(아직 κ΅¬ν˜„ 쀑)

πŸ“Œ JavaScript μž‘μ„±

const startBtn = document.querySelector('.setting-startBtn');
const timer = document.querySelector('.setting-timer');
const clickLimit = document.querySelector('.setting-limit');

// κ²Œμž„ μ‹œμž‘ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄
let time = 10;

startBtn.addEventListener('click', function startTimer () {
  // 타이머가 μž‘λ™ν•΄μ•Ό ν•œλ‹€.
  const decreNum = setInterval(function () {
    const second = time % 60;
    timer.innerHTML = `0:${second}`;
    time--;

    if (time < 0) {
      clearInterval(decreNum);
    }
  }, 1000);
  
  // 클릭 κ°€λŠ₯ νšŸμˆ˜κ°€ 10으둜 λ°”λ€Œμ–΄μ•Ό ν•œλ‹€.
  clickLimit.innerHTML = 10;
});
profile
λŠ₯λ™μ μœΌλ‘œ μ‚΄μž, ν–‰λ³΅ν•˜κ²ŒπŸ˜

0개의 λŒ“κΈ€