๐ก ๋์ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํต์ฌ ๊ฐ์ด๋๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํฉ๋๋ค.
12.0 ํด๋์ค
MDN์์๋ ํด๋์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช
ํด๋์ค๋ ์ผ์ฐจ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ์กด ํ๋กํ ํ์ ๊ธฐ๋ฐ ์์์ ๋ํ ๋ฌธ๋ฒ์ ์คํ์ด๋ค. ํด๋์ค ๋ฌธ๋ฒ์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ก์ด ๊ฐ์ฒด ์งํฅ ์์ ๋ชจ๋ธ์ ๋์ ํ๋ ๊ฒ์ ์๋๋ค.
ํด๋์ค๋ ์ด๋ฏธ ๊ตฌ์ถ๋์ด ์๋ ํ๋กํ ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ถ๊ฐ๋ ๋ฌธ๋ฒ์์ผ๋ก ๋ฌ๋ฌํ, ์ฆ ํธ๋ฆฌํจ์ ์ ๊ณตํ๋ ๋ฌธ๋ฒ
ํด๋์ค์ ์ค๋ธ์ ํธ (Class vs. object)
class
class๋ ์กฐ๊ธ ๋ ์ฐ๊ด์๋ ๊ฒ๋ค์ ๋ฌถ์ด ๋์ fields์ methods์ ์งํฉ
- template
- declare once
- no data in (data๊ฐ ๋ค์ด๊ฐ fields๋ง ๋ค์ด์์)
object
object๋ class์ ์ง์ data๋ฅผ ๋ฃ์ด ๋ง๋ instance
- instance of a class
- created many times
- data in
12.1 ํด๋์ค ์์ฑ
์์ฑ ๋ฐฉ๋ฒ
// ํด๋์ค ์ ์ธ
class Person {
}
// ํด๋์ค ํํ์
const person = class Person {
}
ํด๋์ค ์ ์ธ ๋ฐ ํํ์์ ํธ์ด์คํ ์ด ๋ถ๊ฐ๋ฅํจ
ํด๋์ค ์ ์ธํ๊ธฐ
class Person {
//constructor
constructor(name, age) {
// fields
this.name = name;
this.age = age;
} // ๊ฐ์ฒด์ ๋ฌ๋ฆฌ ๋ฉ์๋ ์ฌ์ด์ ์ผํ ์์
// methods
speak() {
console.log(`${this.name}: hello! I'm ${this.name} and ${this.age} years old.`)
}
}
const newstar = new Person('newstar', 20);
console.log(newstar.age);
newstar.speak();
- ์์ฑ์ ๋ฉ์๋(constructor)๋ ๋จ ํ๋๋ง ์ถ๊ฐ ๊ฐ๋ฅ
12.2 ์ ์ ๋ฉ์๋
์๋์ ๊ฐ์ด ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค ์์ฒด์์ ์ ๊ทผํ ์ ์๋ ์ ์ ๋ฉ์๋ ์ ์ ๊ฐ๋ฅ
class Person {
constructor(name,age){
this.name = name;
this.age = age;
}
static info(){
console.log("I am a Person class, nice to meet you");
}
}
const alberto = new Person("Alberto",26);
alberto.info();
// TypeError: alberto.info is not a function
Person.info();
// I am a Person class, nice to meet you
12.3 set์ get
Setter and getters
์ฌ์ฉ์๊ฐ ์๋ชป๋ ์ ๋ ฅ ๊ฐ์ ๋ฃ์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ๋ฐฉ์ด์ ์ธ ์์ธ๋ก ์ฝ๋๋ฅผ ์ง๋ ๋ฐฉ๋ฒ
get
์ด๋ผ๋ ํค์๋๋ก ๊ฐ์ returnํ๊ณ set
์ด๋ผ๋ ํค์๋๋ก ๊ฐ์ ์ค์
์ปคํผ ์ํ๊ธฐ ์์
- ์ปคํผ ์ํ๊ธฐ - class
- ์ปคํผ์ ์ข ๋ฅ - integer (int a cup of coffee)
- ๋์ ๋ฃ๊ธฐ, ์ปคํผ ๋ง๋ค๊ธฐ - methods (put coin, make coffee)
→ ์ ๊ฐ์ ์ํฉ์์ ์ปคํผ์ ์ข ๋ฅ ๊ฐ์ -1์ด ๋ค์ด๊ฐ ์ ์๋๊ฐ? ๊ทธ๋ด ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ getter์ setter๋ฅผ ์ฌ์ฉํ๋ ๊ฒ!
class Person {
constructor(name,surname) {
this.name = name;
this.surname = surname;
this.nickname = "";
}
set nicknames(value){
this.nickname = value;
console.log(this.nickname);
}
get nicknames(){
console.log(`Your nickname is ${this.nickname}`);
}
}
const alberto = new Person("Alberto","Montalesi");
// first we call the setter
alberto.nicknames = "Albi";
// "Albi"
// then we call the getter
alberto.nicknames;
// "Your nickname is Albi"
- ๋ ๋ค๋ฅธ ์์์ ์ฝ๋ get๊ณผ set ๊ตฌ๋ฌธ ์์์
this.age
๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ์ ๋๋ ์ด์ class User { constructor(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } get age() { return this._age; // this.age๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด call stack ์ด๊ณผ ์ค๋ฅ๊ฐ ๋ธ. ๊ด์ฉ์ ์ผ๋ก _(์ธ๋๋ฐ) ์ฌ์ฉ. } set age(value) { //if (value < 0) { // throw Error('age can not be negative.'); //} this._age = value < 0 ? 0 : value; } } const user1 = new User('Steve', 'Job', -1); console.log(user1.age); // 0
12.4 ํด๋์ค ์์ํ๊ธฐ
extends
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์
class Shape {
constructor(width, height, color) {
this.width = width;
this.height = height;
this.color = color;
}
draw() {
console.log(`drawing ${this.color} color!`);
}
getArea() {
return this.width * this.height;
}
}
class Rectangle extends Shape {}
class Triangle extends Shape {
constructor(width, height, color, position) {
super(width, height, color)
this.position = position;
}
draw() { // ๋ถ๋ชจ class์ ๋ฉ์๋๋ฅผ Overwritingํ์ฌ ์ฌ์ ์ํ ์ ์์
super.draw(); // ์์๋ฐ์ ๋ถ๋ชจ class์ draw ๋ฉ์๋๋ฅผ ํธ์ถ
console.log('Ta-da! triangle :)');
}
getArea() {
return (this.width * this.height) / 2;
}
}
const rectangle = new Rectangle(20, 20, 'blue');
rectangle.draw();
console.log(rectangle.getArea());
const triangle = new Triangle(20, 20, 'red', 'inside');
triangle.draw();
console.log(triangle.getArea());
12.5 ๋ฐฐ์ด ํ์ฅํ๊ธฐ
๋ฐฐ์ด(Array)์ ์์๋ฐ์ ํด๋์ค๋ฅผ ์์ฑํ ์ ์์
class Classroom extends Array {
// rest๋ฅผ ์ด์ฉํด ๊ฐ๋ณ ์ธ์๋ก ์
๋ ฅ๋ฐ์ ํ์๋ค์ ์ ๋ณด๋ฅผ ๋ฐฐ์ด ํํ๋ก students์ ํ ๋น
constructor(name, ...students){
// spread๋ฅผ ์ด์ฉํด ๋ฐฐ์ด์ ๋ค์ ํ์ด ์์ฑ์๋ฅผ ํธ์ถ (spread ์ฌ์ฉ ์ ํ๋ฉด ๋ฐฐ์ด์ด ์์ฑ๋จ)
super(...students);
this.name = name;
}
// ํ์ ์ถ๊ฐ๋ฅผ ์ํ ๋ฉ์๋
add(student){
this.push(student);
}
}
const myClass = new Classroom('1A',
{name: "Tim", mark: 6},
{name: "Tom", mark: 3},
{name: "Jim", mark: 8},
{name: "Jon", mark: 10},
);
// ์๋ก์ด ํ์ ์ถ๊ฐ
myClass.add({name: "Timmy", mark:7});
myClass[4];
// Object { name: "Timmy", mark: 7 }
// for of ์ฌ์ฉํ์ฌ ๋ฐ๋ณต ๊ฐ๋ฅ
for(const student of myClass) {
console.log(student);
}
// Object { name: "Tim", grade: 6 }
// Object { name: "Tom", grade: 3 }
// Object { name: "Jim", grade: 8 }
// Object { name: "Jon", grade: 10 }
// Object { name: "Timmy", grade: 7 }