๋คํ์ฑ
- ์ ์ : ๋คํ์ฑ์ด๋ ํ๋์ ์ด๋ฆ(๋ฐฉ๋ฒ)์ผ๋ก ๋ง์ ์ํฉ์ ๋์ฒํ๋ ๊ธฐ๋ฒ์ด๋ค.
- ํจ๊ณผ : ๊ฐ๋ ์ ์ผ๋ก ๋์ผํ ์์ ์ ํ๋ ํจ์๋ค์ ๋๊ฐ์ ์ด๋ฆ์ ๋ถ์ฌํ ์ ์์ผ๋ฏ๋ก ์ฝ๋๊ฐ ๋ ๊ฐ๋จํด์ง๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค.
์ด๋ฅผ ํตํด ์ฝ๋์ ์ฌ์ฌ์ฉ, ์ฝ๋ ๊ธธ์ด ๊ฐ์๊ฐ ๋์ด ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋๋ก ๋์์ค๋ค.
์์ ์ค๋ช ์ ์กฐ๊ธ ๋ ํ์ด ์ค๋ช ํ์๋ฉด, ์๋์ ๊ฐ๋ค.
๋คํ์ฑ์ [์์]์์ ๋น๋กฏ๋๋ ํฐ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค. ๋คํ์ฑ์ ์์์ ํตํด ๋์ผ ์ด๋ฆ์์๋ ๊ทธ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค. ๋คํ์ฑ : ๊ฐ์ ์ด๋ฆ์ ๋ถ๋ ๋๋ฐ ๋ค๋ฅธ ํ์์ ํ๋ ๊ฒ(๊ฐ์ ๋์์ด์ง๋ง ๋ค๋ฅธ ๊ณผ์ ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์ด)
[ํด๋์ค ์์]
extends
ํด๋์ค ์์์ ์ ์ด์ฉํ๋ฉด ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ๋ฉด์,
์์ํด๋์ค์์๋ง ์กฐ๊ธ ๋ ์์ํด๋์ค์ ํนํ๋ ๊ธฐ๋ฅ๋ค์ ํ ์ ์๊ณ , ์ถ๊ฐํ ์๋ ์๋ค. (์ค๋ฒ๋ผ์ด๋ฉ)
๊ทธ๋ฆฌ๊ณ super๋ผ๋ ํค์๋๋ฅผ ์ด์ฉํด์ ๋ถ๋ชจ ํด๋์ค์ ์๋ ํจ์๋ค์ ํธ์ถํ๊ฑฐ๋ ์ ๊ทผํ ์๋ ์๋ค.
[์ธํฐํ์ด์ค ๊ตฌํ]
implements
์ธํฐํ์ด์ค ๊ตฌํ์ ์ ์ด์ฉํ๋ฉด ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ํจ์๋ค์ ๋ค์ํ ํด๋์ค๋ค์ด ๊ฐ์ง ์ ์๊ฒ ๋๊ณ ,
์ด๋ฆ ํธ์ถ์ ๋ํ์ฌ ๋ค๋ฅธ ๊ตฌํ๋ฐฉ์์ ๊พํ ์ ์๊ฒ ๋๋ค.
๋คํ์ฑ(์ ํน์ฅ์ )์ด๋, 'ํ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ' ๋๋ '๊ฐ์ ๋ถ๋ชจ์ ํด๋์ค๋ฅผ ์์'ํ ์์ํด๋์ค๋ค์ด,
๊ณตํต ์ธํฐํ์ด์ค ํน์ ๊ฐ์ ๋ถ๋ชจ ํด๋์ค์ ์๋ ํจ์๋ค์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ค์ํ๊ฒ ๊ตฌํํ ์ ์๋ ๊ฒ์ ๋งํ๋ค!!!
- ๋คํ์ฑ์ด๋ ํ๋์ ์ด๋ฆ(๋ฐฉ๋ฒ)์ผ๋ก ๋ง์ ์ํฉ์ ๋์ฒํ๋ ๊ธฐ๋ฒ.
- ๊ฐ๋ ์ ์ผ๋ก ๋์ผํ ์์ (์ด์ง๋ง ๋ด๋ถ์ ์ธ๋ถ ์์ ๋ค์ ๊ฐ์ ๋ค๋ฅธ)์ ํ๋ ํจ์๋ค(๋ถ๋ช ์ด๋ฆ์ ๊ฐ์ง๋ง ๋ค ๋ค๋ฅธ ํด๋์ค ์ถ์ ์ธ)
- ์ด API๋ฅผ ๊ณตํต์ด๋ฆ์ผ๋ก ํธ์ถํ๋ฉด ํด๋์ค๋ค์ด ๊ฐ์ ๊ฐ๋ ์ผ์ง๋ผ๋ ์ฌ์ธํ๊ฒ ๋ค๋ฅธ ๋์๋ค์ ํ๋ Magin-
- ํจ๊ณผ : ์ฝ๋๊ฐ ๋ ๊ฐ๋จํด์ง
์ด๋ ๊ฒ ์ ๋ฆฌํ๋ฉด ๋๋ค.
๋ชจ๋์๊ฒ ๊ฐ์ ์ด๋ฆ์ ํจ์๋ฅผ ๋ถ๋ฌ๋ ๋ค ๋ค๋ฅธ ํ๋์ ํ๋ค -> ์ฆ, ๊ฐ๊ฐ์ ์ ์ํ ํ์๊ฐ ์์ด์ง๋ API๊ฐ ๊ฐ์ํ๋๊ณ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ค.
์ด๋ ๊ฒ ๊ณตํต ์ธํฐํ์ด์ค ํน์ ๊ฐ์ ๋ถ๋ชจ ํด๋์ค์ ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์์,
๊ฐ๋ฐ์๋ ๊ฐ ํด๋์ค๋ค์ ์ธ๋ถ์ ์ธ ๋ด๋ถ ๊ตฌํ์ฌํญ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๊ณตํต API๋ง์ ๋ณด๊ณ ๋ฝ์ ์ธ ์ ์๊ฒ ๋๋ ์ฌ์ฉ์์๋ ๊ฐํธํจ์ ๋๋ ์ ์๋ค.
<๋คํ์ฑ ์์1>
์๋ฅผ ๋ค๋ฉด, ๋๋ฌผ ํด๋์ค์ ์ธ์() "cry"
๊ณ ์์ด ํด๋์ค์ ์ธ์(): ์ค๋ฒ๋ผ์ด๋ฉ "๋์น"
๊ฐ์์ง ํด๋์ค์ ์ธ์(): ์ค๋ฒ๋ผ์ด๋ฉ "์์๋ฉ๋ฉ"
๊ฐ์ "์ธ์" ์์ฑ์์๋ ์ค์ ์ธ์์๋ฆฌ๋ ๋ค๋ฅด๊ฒ ๊ตฌํ๋๋ค.
OOP์์ ๋คํ์ฑ์ ๊ฐ๋ ์ ๋ น์ฌ๋ด๋ ๋ฐฉ๋ฒ์, ์ค๋ฒ๋ผ์ด๋ฉ(Overriding)๊ณผ ์ค๋ฒ๋ก๋ฉ(Overloading)์ด๋ค.
- ์ค๋ฒ๋ผ์ด๋ฉ
- ๋ถ๋ชจ ํด๋์ค์์ ์์๋ฐ์ ์์ ํด๋์ค์์ ๋ถ๋ชจํด๋์ค์์ ๋ง๋ค์ด์ง ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ์์ ํด๋์ค ํน์ง์ ๋ง๊ฒ ์ฌ์ ์ํด์ ์ฌ์ฉํ๋ ๊ฒ - ์ค๋ฒ๋ก๋ฉ
- ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ฉ์๋๋ง๋ค ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉ๋๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ๋ ๋ค๋ฅด๊ฒ ๊ตฌํํ ์ ์๊ฒ ๋ง๋๋ ๊ฐ๋ - ์ค๋ฒ๋ก๋ฉ์ด ๊ฐ๋ฅํ๋ ค๋ฉด ๋ฉ์๋๋ผ๋ฆฌ ์ด๋ฆ์ ๊ฐ์ง๋ง ๋งค๊ฐ๋ณ์์ ๊ฐฏ์๋ ๋ฐ์ดํฐ ํ์ ์ด ๋ค๋ฅด๋ฉด ์ค๋ฒ๋ก๋ฉ์ด ์ ์ฉ
์์
(์๋ฐ์คํฌ๋ฆฝํธ ์ ๋ฆฌ ์๋ฃ์ธ๋ฐ ๊ฒน์น๋ ์๊ธฐ๋ผ์ ์ฌ๊ธฐ ๋ณต๋ถํฉ๋๋ค.)
ํด๋์ค ์์์ ์ฌ์ฉํ๋ฉด ํด๋์ค๋ฅผ ๋ค๋ฅธ ํด๋์ค๋ก ํ์ฅํ ์ ์๋ค.
๊ธฐ์กด์ ์กด์ฌํ๋ ๊ธฐ๋ฅ์ ํ ๋๋ก ์๋ก์ด ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์๋ค.
ํค์๋ extends ํ์ฉ
์์์ด ํ์ํ ์ด์
์ฝ๋์ ์ค๋ณต์ ์์ ๊ธฐ ์ํจ
์ฝ๋์ ์ค๋ณต์ด ๋ง์์ง๋ฉด ๊ฐ๋ฐ ๋จ๊ณ์์๋ ํผ๊ณคํ์ง๋ง, ์ ์ง ๋ณด์์์๋ ๋ง์ ๋น์ฉ์ด ๋ค๊ฒ ๋๋ค.
class Shape {
constructor(width, height, color) {
this.width = width;
this.height = height;
this.color = color;
}
draw() {
console.log(`drawing ${this.color} color of`);
}
getArea() {
return this.width * this.height;
}
}
class Rectangle extends Shape {}
const rectangle1 = new Rectangle(20, 20, "blue");
rectangle1.draw(); //drawing blue color
const rectangle2 = new Rectangle(10, 50, "pink");
rectangle2.draw(); //drawing pink colorโ
์์ ํ ์ค๋ฒ๋ผ์ด๋ฉ
shape๋ผ๋ class๋ฅผ ์ฌ๊ฐํ๊ณผ ์ผ๊ฐํ์ ์์ํ๋,
๊ฐ๊ฐ์ ํน์ฑ์ ๊ณ ๋ คํ ์ค๋ฒ๋ผ์ด๋ฉ
<์ผ์ด์ค 1 : ํจ์ ๋ด์ฉ์ ์์ ๋ฐ๊พผ๋ค.>
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 {}
const rectangle1 = new Rectangle(20, 20, "blue");
console.log(rectangle1.getArea()); //400
const rectangle2 = new Rectangle(10, 50, "pink");
console.log(rectangle2.getArea()); //500
class Triangle extends Shape {
//ํ์ํ ํจ์๋ง ์ฌ์ ์ ํด์ ์ด๋ค (์ค๋ฒ๋ผ์ด๋ฉ)
getArea() {
return (this.width * this.height) / 2;
}
}
const triangle1 = new Triangle(20, 20, "orange");
console.log(triangle1.getArea()); //200
const triangle2 = new Triangle(10, 50, "skyblue");
console.log(triangle2.getArea()); //250โ
<์ผ์ด์ค 2 : ๋ถ๋ชจ์ ์ ์๋ ํจ์๋ ๋ถ๋ฅด๊ณ ์ถ๋ค๋ฉด super.๋ฉ์๋๋ช () >
class Shape {
constructor(width = "2", height = "2", color = "white") {
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 {
draw() {
console.log("๏นฎ");
}
}
const rectangle = new Rectangle(10, 10, "red");
rectangle.draw(); //๏นฎ
class Triangle extends Shape {
draw() {
super.draw();
console.log("โ");
}
getArea() {
return (this.width * this.height) / 2;
}
}
const triangle = new Triangle(10, 5, "yellow");
triangle.draw(); //drawing yellow color
//โ
์์ฑ์ ์ค๋ฒ๋ผ์ด๋ฉ
์ผ๋ฐ ํด๋์ค์ ์์ฑ์ ํจ์์ ์์ ํด๋์ค์ ์์ฑ์ ํจ์ ๊ฐ ์ฐจ์ด๋ new์ ํจ๊ป ๋๋ฌ๋๋ค.
- ์ผ๋ฐ ํด๋์ค๊ฐ new์ ํจ๊ป ์คํ๋๋ฉด, ๋น ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณ this์ ์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค.
- ๋ฐ๋ฉด, ์์ ํด๋์ค์ ์์ฑ์ ํจ์๊ฐ ์คํ๋๋ฉด, ์ผ๋ฐ ํด๋์ค์์ ์ผ์ด๋ ์ผ์ด ์ผ์ด๋์ง ์๋๋ค. ์์ ํด๋์ค์ ์์ฑ์ ํจ์๋ ๋น ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ this์ ์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ ์ผ์ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๊ฐ ์ฒ๋ฆฌํด์ฃผ๊ธธ ๊ธฐ๋ํ๋ค.
์ด๋ฐ ์ฐจ์ด ๋๋ฌธ์ ์์ ํด๋์ค์ ์์ฑ์์์ super๋ฅผ ํธ์ถํด ๋ถ๋ชจ ์์ฑ์๋ฅผ ์คํํด ์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด this๊ฐ ๋ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง์ง ์์ ์๋ฌ๊ฐ ๋ฐ์
์๋ ์์์ ๊ฐ์ด this๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ super()๋ฅผ ํธ์ถํ๋ฉด Rabbit์ ์์ฑ์๊ฐ ์ ๋๋ก ๋์ํฉ๋๋ค.
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
}
class Rabbit extends Animal {
constructor(name, earLength) {
super(name);
this.earLength = earLength;
}
}
// ์ด์ ์๋ฌ ์์ด ๋์
let rabbit = new Rabbit("ํฐ ํ ๋ผ", 10);
console.log(rabbit.name); // ํฐ ํ ๋ผ
console.log(rabbit.earLength); /