트랙
/
JavaScript
JavaScript
/
연습 문제
/
최고 점수 게시판
최고 점수 게시판

최고 점수 게시판

학습 연습 문제

소개

설명

number와 string 같은 원시 자료형 말고도, JavaScript에는 object라는 또 다른 중요한 자료형이 있어요. 객체는 키-값 쌍의 모음이에요. 그래서 다른 언어에서 흔히 맵이나 딕셔너리라고 부르는 것과 같은 방식으로 사용할 수 있어요.

다른 언어에서는 맵에 들어 있는 모든 값이 같은 자료형이어야 하는 경우가 많아요. JavaScript에서는 키의 자료형만 제한되는데, 키는 반드시 string이어야 해요. 한 객체 안의 값들은 서로 다른 자료형일 수 있어요. 숫자 같은 원시 자료형일 수도 있고, 배열이나 다른 객체, 심지어 함수일 수도 있어요. 덕분에 객체는 활용도가 매우 높아서, JavaScript에서 객체 지향 프로그래밍(OOP)의 핵심 요소이기도 해요.

이하에서는 객체를 모음이나 맵으로서 살펴볼게요. 객체의 다른 활용법은 다른 개념에서 다뤄요. 예를 들어 클래스를 참고해요.

객체 만들기

중괄호를 사용해서 객체를 만들어요. 항목을 몇 개 바로 넣을 수도 있어요. 그럴 때는 키를 먼저 쓰고, 콜론과 값을 이어서 적어요.

const emptyObject = {};

const obj = {
  favoriteNumber: 42,
  greeting: 'Hello World',
  useGreeting: true,
  address: {
    street: 'Trincomalee Highway',
    city: 'Batticaloa',
  },
  fruits: ['melon', 'papaya'],
  addNumbers: function (a, b) {
    return a + b;
  },
};

JavaScript에서는 마지막 항목 뒤에 오는 쉼표는 있어도 되고 없어도 돼요.

키는 문자열이어야 하는데 왜 따옴표로 감싸지 않는지 궁금할 수 있어요. 이건 축약 표기법이에요. 키가 JavaScript 식별자 이름 규칙을 따르면 따옴표를 생략할 수 있어요. 이름에 특수 문자가 들어가는 키는 일반적인 문자열 표기법을 사용해야 해요.

const obj = {
  '1keyStartsWithNumber': '...',
  'key/with/slashes': '...',
  'key-with-dashes': '...',
  'key with spaces': '...',
  '#&()[]{}èä樹keyWithSpecialChars': '...',
};

값 가져오기

주어진 키의 값을 가져오는 방법에는 점 표기법과 대괄호 표기법, 두 가지가 있어요.

const obj = { greeting: 'hello world' };

obj.greeting;
// => hello world

obj['greeting'];
// => hello world

// Bracket notation also works with variables.
const key = 'greeting';
obj[key];
// => hello world

축약형인 점 표기법에도 따옴표를 생략할 때와 같은 제약이 있어요. 키가 식별자 이름 규칙을 따를 때만 사용할 수 있어요.

값 추가하거나 바꾸기

할당 연산자 =를 사용해서 값을 추가하거나 바꿀 수 있어요. 여기서도 점 표기법과 대괄호 표기법을 모두 사용할 수 있어요.

const obj = { greeting: 'hello world' };

obj.greeting = 'Hi there!';
obj['greeting'] = 'Welcome.';

obj.newKey1 = 'new value 1';
obj['new key 2'] = 'new value 2';

const key = 'new key 3';
obj[key] = 'new value 3';

항목 삭제하기

delete 키워드를 사용해서 객체에서 키-값 쌍을 삭제할 수 있어요.

const obj = {
  key1: 'value1',
  key2: 'value2',
};

delete obj.key1;
delete obj['key2'];

키가 있는지 확인하기

hasOwnProperty 메서드로 객체에 특정 키가 있는지 확인할 수 있어요.

const obj = { greeting: 'hello world' };

obj.hasOwnProperty('greeting');
// => true

obj.hasOwnProperty('age');
// => false

객체 순회하기

객체의 모든 키를 순회하는 특별한 for...in문이 있어요.

const obj = {
  name: 'Ali',
  age: 65,
};

for (let key in obj) {
  console.log(key, obj[key]);
}
// name Ali
// age 65

미묘한 오류를 피하려면 for...in문이 키를 임의의 순서로 방문한다고 항상 가정해야 해요. 또한 for...in문은 순회할 때 상속받은 키도 포함한다는 점을 알아두세요.

지침

이 연습 문제에서는 동네 오락실에서 가장 인기 있는 게임의 최고 점수를 관리하는 방법을 구현해요.

최고 점수를 담는 객체를 다루는 함수 5개를 구현해야 해요.

1. 새로운 최고 점수 게시판을 만들어요

최고 점수 게시판 역할을 하는 객체를 만드는 createScoreBoard 함수를 만들어요. 이 객체의 키는 플레이어의 이름이고, 값은 그 플레이어의 점수예요. 테스트를 위해 객체에 항목 하나를 직접 넣어야 해요. 이 초기 항목은 플레이어 이름 The Best Ever와 점수 1000000으로 구성되어야 해요.

createScoreBoard();
// returns an object with one initial entry

2. 점수 게시판에 플레이어를 추가해요

최고 점수 게시판에 플레이어를 추가하려면 addPlayer 함수를 정의해요. 이 함수는 매개변수 3개를 받아요:

  • 첫 번째 매개변수는 기존 점수 게시판 객체예요.
  • 두 번째 매개변수는 플레이어의 이름인 문자열이에요.
  • 세 번째 매개변수는 점수인 숫자예요.

이 함수는 새 플레이어를 추가한 뒤, 전달받은 것과 같은 점수 게시판 객체를 반환해요.

addPlayer({ 'Dave Thomas': 0 }, 'José Valim', 486373);
// => {'Dave Thomas': 0, 'José Valim': 486373}

3. 점수 게시판에서 플레이어를 제거해요

플레이어가 오락실 규칙을 어기면 최고 점수 게시판에서 직접 제거해요. removePlayer를 정의하는데, 이 함수는 매개변수 2개를 받아요:

  • 첫 번째 매개변수는 기존 점수 게시판 객체예요.
  • 두 번째 매개변수는 플레이어의 이름인 문자열이에요.

이 함수는 게시판에서 주어진 플레이어의 항목을 제거하고, 그 뒤 게시판을 반환해야 해요. 플레이어가 애초에 게시판에 없었다면, 게시판에는 아무 일도 일어나지 않아야 해요. 그대로 반환하면 돼요.

removePlayer({ 'Dave Thomas': 0 }, 'Dave Thomas');
// => {}

removePlayer({ 'Dave Thomas': 0 }, 'Rose Fanaras');
// => { 'Dave Thomas': 0 }

4. 플레이어의 점수를 올려요

플레이어가 오락실에서 다른 게임을 끝내면, 게시판의 이전 점수에 일정량의 점수가 더해져요. updateScore를 구현하는데, 이 함수는 매개변수 3개를 받아요:

  • 첫 번째 매개변수는 기존 점수 게시판 객체예요.
  • 두 번째 매개변수는 점수를 올릴 플레이어의 이름이에요.
  • 세 번째 매개변수는 저장된 최고 점수에 더할 점수예요.

이 함수는 업데이트가 끝난 뒤 점수 게시판을 반환해야 해요.

updateScore({ 'Freyja Ćirić': 12771008 }, 'Freyja Ćirić', 73);
// => {"Freyja Ćirić", 12771081}

5. 월요일 보너스 점수를 적용해요

오락실은 월요일마다 별도의 점수 게시판을 운영해요. 하루가 끝나면 그 게시판에 있는 각 플레이어는 100점을 추가로 받아요.

점수 게시판을 받는 applyMondayBonus 함수를 구현해요. 이 함수는 그 게시판에 올라 있는 각 플레이어에게 보너스 점수를 더해요. 그 뒤 게시판을 반환해요.

const scoreBoard = {
  'Dave Thomas': 44,
  'Freyja Ćirić': 539,
  'José Valim': 265,
};

applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
JavaScript Exercism

최고 점수 게시판 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 JavaScript 트랙을 개념 37개연습 문제 159개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.