Object(객체)는 아래와 같은 형태를 지닌 data type을 말하며, Array와 다르게 내부의 요소들에 정해진 순서가 없다. (용이한 데이터 관리와 깔끔한 코드를 위해 활용)
var 객체명 = {
property(key)1 : value1,
property(key)2 : value2,
property(key)3 : value3
}
Object는 활용할 때 지켜야하는 몇 가지 조건이 있다.
특정 object가 선언되었다면, Object 내의 각 property 값에는 어떻게 접근할 수 있을까?
객체명.property1
마침표를 활용하면 조금 더 쉽게 코드를 작성할 수 있지만, 사용할 수 없는 경우가 있다.
객체명["property1"]
property 값(value)과 동일한 변수명을 활용하여 접근할 경우
property 이름(key)에 숫자, 스페이스나 특수문자가 들어갈 경우
등 위와 같은 경우에서는 대괄호를 사용하여 object의 key 값에 접근해야 한다.
객체에서는 재선언을 통해 키 값을 변경할 수 있고, 새로운 키와 값을 추가할 수도 있다.
또한 배열의 for문이나 map()
메소드처럼, 객체에도 키를 순회할 수 있는 메소드가 2가지 있다.
Object.keys()
메소드는 객체가 가지고 있는 모든 키를 모아 배열로 반환하는 메소드이다. 이와 비슷하게 객체가 가지고 있는 키 값을 배열로 반환하는 Object.values()
그리고 객체의 키와 값을 배열 내 배열의 형태로 반환하는 Object.entries()
까지 다양한 메소드가 있다.const obj = {
name: 'melon',
weight: 4350,
price: 16500,
isFresh: true
}
Object.keys(obj) // ['name', 'weight', 'price', 'isFresh']
const values = Object.values(obj)
// values === ['melon', 4350, 16500, true]
const entries = Object.entries(obj)
/*
entries === [
['name', 'melon'],
['weight', 4350],
['price', 16500],
['isFresh', true]
]
*/
for-in
은 for
문과 비슷한 종류의 반복문이며, 객체와 배열에 모두 활용할 수 있다. for-in
문은 인덱스의 값으로 무엇을 할당하고 반복문이 몇번 돌아야 할 지 자바스크립트 엔진 내부에서 자동으로 결정한다.for문)
const arr = ['coconut', 'banana', 'pepper', 'coriander']
for (let i = 0; i < arr.length; i ++) {
console.log(i)
console.log(arr[i])
}
for-in문)
for (let i in arr) {
console.log(i)
console.log(arr[i])
}
for-in문으로 객체 순회하기)
const obj = {
name: 'melon',
weight: 4350,
price: 16500,
isFresh: true
}
for (let key in obj) {
const value = obj[key]
console.log(key)
console.log(value)
}
아래 설명을 읽고 getExamResult 함수를 구현하세요
scores 객체의 예시)
{ '생활속의회계': 'C',
'논리적글쓰기': 'B',
'독일문화의이해': 'B+',
'기초수학': 'D+',
'영어회화': 'C+',
'인지발달심리학': 'A+',
}
requiredClasses 배열의 예시)
['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']
['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']
A+ => 4.5
A => 4
B+ => 3.5
B => 3
C+ => 2.5
C => 2
D+ => 1.5
D => 1
F => 0
const getExamResult = (scores, requiredClasses) => {
let result = {};
let obj = {
'A+': 4.5,
'A': 4,
'B+': 3.5,
'B': 3,
'C+': 2.5,
'C': 2,
'D+': 1.5,
'D': 1,
'F': 0
}
for (let i in requiredClasses){
let key = requiredClasses[i];
result[key] = 0;
};
let scoreKey = Object.keys(scores);
for (let i in scoreKey){
let key2 = scoreKey[i];
let grade = scores[key2];
result[key2] = obj[grade];
};
return result;
}
1. 코드 작성 순서
result라고 명명한 빈 객체에 scores 객체의 요소들을 먼저 추가해야한다고 생각했는데, value가 정해진 키에도 값이 0으로 할당되는 문제가 발생했다. JS Bin에서 코드 내에 각각 console.log를 포함하여 찍어보니, 값이 재할당되면서 생기는 문제인 것으로 판단되었다. requiredClasses의 키값이 나중에 부여되면서, 0 이외의 값이 이미 있는 키에도 value가 0으로 재할당 되어 생기는 문제였던 듯. 그래서 requiredClasses의 키를 먼저 추가하니 문제 해결.
2. 점수를 알파벳에서 숫자 형태로 변경하는 방법
if문을 활용하여 점수를 알파벳에서 숫자로 변경하는 함수를 작성하였다가 자꾸 오류가 나서 검색해보니 별도의 객체를 만들어 사용하는 방법이 있었다. if문보다 훨씬 코드가 간결해짐.
3. 배열과 객체 요소 접근 방법
변수에 값을 저장할 때 활용해야 하는 배열 & 객체 요소의 접근 방법이 많이 헷갈렸다. 더 많이 연습해야 할 듯.
class
는 객체지향 프로그래밍의 핵심으로, 원하는 구조의 객체 틀을 짜놓고 비슷한 형태의 객체를 계속적으로 만들어낼 수 있는 개념이다. class
를 통해 객체를 생성하는 과정을 '인스턴스화'라고 부르고, 그로 인해 생성된 객체를 '인스턴스'라고 부른다.
class Car {
constructor(name, price) {
this.name = name;
this.price = price;
}
}
class
의 이름은 언제나 대문자로 시작한다.class
의 인스턴스를 생성할 때마다 constructor()
메서드가 호출된다.constructor()
메서드에 this
키워드를 사용했는데, class
의 실행범위에서 this
는 해당 instance를 의미한다.class
의 인스턴스는 아래와 같이 생성할 수 있다.
const morning = new Car('Morning', 20000000);
class
이름 앞에 new를 붙여 생성한다.constructor()
내에서 필요한 인자를 넘겨준다.또한 class
내에는 메서드를 추가할 수 있으며, 객체와 달리 콤마로 구분할 필요가 없다.
class Car {
constructor(name, price) {
this.name = name;
this.price = price;
this.department = "선릉지점";
}
applyDiscount(discount) {
return this.price * discount;
}
changeDepartment(departmentName) {
this.department = departmentName;
}
}