์๊ฐ ๋ ๋๋ง๋ค MDN-JavaScript reference ์์ฃผ ํ์ธํ๊ณ ๊ณต๋ถํ ๊ฒ!
class๋, ์ฐ๊ด์ฑ์๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฐ ๋ฌถ์ด์ฃผ๋ container ๊ฐ์ ์์ด!
class์์๋, ์ด๋ ๊ฒ name
๊ณผ age
๊ฐ์ Property(์์ฑ) = field ๊ฐ ๋ค์ด์๊ณ , speak()
์ด๋ผ๋ Function(ํจ์) = method ๊ฐ ๋ค์ด์๋ค.
class๋ ์ด๋ ๊ฒ ์๋ก ์ฐ๊ด๋ fields ์ methods ๋ก ๊ตฌ์ฑ๋์ด์ ธ ์๋ค.
๊ฐํน method๋ ์๊ณ , fields ๋ก๋ง ๊ตฌ์ฑ๋ class๋ ์๋๋ฐ, ์ด๋ฅผ data class ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Syntatic Sugar?
๐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ฐจ์์์ ์ ๊ณต๋๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ๊ฒฐํ๊ฒ(=๋ฌ๋ฌํ๊ฒ) ํํํ๋ ๊ฒ
๐ ์ค๋ณต๋๋ ๋ก์ง์ ๊ฐ๊ฒฐํ๊ฒ ํํํ๊ธฐ ์ํด ๋ํ๋๊ฒ ๋์๋ค.
(์๋ฅผ ๋ค์ดx = x + 5;
๋ผ๋ ์ฝ๋๋ ์นด์นด์ค 99% ๋ฒ์ ์ด๊ณ ,x += 5;
๊ฐ ๋ฌ๋ฌํ Syntatic Sugar์ด๋ค.)
์ด๋ค ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ์ ๊ทผํด์ ์ฌ์ฉํ๋ ํจ์๋ฅผ ๋ฉ์๋(method)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
โ ํจ์๋ผ๋ ์ด๋ฆ์ด ์๋๋ฐ, ์ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฑธ๊น?
๊ทธ ์ด์ ๋ ๋ค๋ฅธ ํจ์์๋ ๋ค๋ฅด๊ฒ ๋์ํ๊ธฐ ๋๋ฌธ!
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด : ๋ฐ์ดํฐ์, ๊ทธ ๋ฐ์ดํฐ์ ๊ด๋ จ๋ ๋์์ ๊ฐ์ฒด๋ผ๋ ํ๋์ ๋จ์๋ก ๋ฌถ์ด์ ๋ค๋ฃฐ ์ ์๋ค!
๋ฉ์๋ ํธ์ถ ์์ ํด๋น ๋ฉ์๋๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ค.
์์ฑ์ ์์์ this ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด์ ์์ฑ์ ์ง์ ํด์ค ์ ์๋ค.
ํจ์ ๋ด๋ถ์ this ํค์๋๊ฐ ์ค์ ๋ก ๋ฌด์์ ๊ฐ๋ฆฌํฌ ๊ฒ์ธ๊ฐ๋, ๋ฉ์๋๊ฐ ์ด๋ป๊ฒ ์ ์๋๋๊ฐ์ ์ํด ๊ฒฐ์ ๋๋ ๊ฒ์ด ์๋๋ผ ๋ฉ์๋๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋๊ฐ์ ์ํด ๊ฒฐ์ ๋๋ค.
์ด๊ฒ ๋ญ๋ง์ธ๊ณ ํ๋...
function introduce() {
return `์๋
ํ์ธ์, ์ ์ด๋ฆ์ ${this.name}์
๋๋ค.`;
}
const person1 = {
name: '์๋ฏธ',
introduce // ์ฌ์ฌ์ฉ๋ ํจ์
};
const person2 = {
name: '์ฝ๋ฆฐ์ด',
introduce // ์ฌ์ฌ์ฉ๋ ํจ์
};
person1.introduce(); // ์๋
ํ์ธ์, ์ ์ด๋ฆ์ ์๋ฏธ์
๋๋ค.
person2.introduce(); // ์๋
ํ์ธ์, ์ ์ด๋ฆ์ ์ฝ๋ฆฐ์ด์
๋๋ค.
introduce
๋ผ๋ ๊ฐ์ ํจ์๋ person1 ๊ณผ person2 ์์ ์ฌ์ฌ์ฉ ํ๋๋ฐ๋, ๊ฒฐ๊ณผ๊ฐ์ ๋ณด๋ฉด person1๊ณผ 2๋ ๋ค๋ฅธ ์ด๋ฆ์ด ์ถ๋ ฅ๋๋ค. ์ฆ, introduce
ํจ์์ ์ฌ์ฉ๋ this
๋ person1,2 ์์ ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํจ ๊ฒ!
๊ฐ์ ํจ์์์๋ ๋ถ๊ตฌํ๊ณ ์ด๋ค ๊ฐ์ฒด์ ๋ฉ์๋๋ก ์ฌ์ฉ๋๋๋์ ๋ฐ๋ผ ๋ฉ์๋ ๋ด๋ถ์ this๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค!
๋ค๋ง, ํ์ดํ ํจ์์์๋ this ํค์๋๋ฅผ ์ ํ ๋ค๋ฅด๊ฒ ์ทจ๊ธํ๋ค.
ํ์ดํ ํจ์์ this ์ด์ผ๊ธฐ๋ ๋ค์ ์๊ฐ์ ๊ณ์...
class Person {
constructor(name, age) { // constructor
this.name = name; // field
this.age = age;
}
speak() { //method
console.log(`${this.name} hello!`);
}
} // ๋จผ์ , class์ ์ด๋ค data๊ฐ ๋ค์ด๊ฐ ์ง ์ ์ํ ํ์
const solmi = new Person("solmi", 26); // ์ค์ data๋ฅผ ์
๋ ฅ
console.log(solmi.name) // solmi ์ถ๋ ฅ
console.log(solmi.age) // 26 ์ถ๋ ฅ
โ ์ด๋ ๊ฒ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ new ํค์๋์ ํจ๊ป ์ฌ์ฉํ๋ ํจ์๋ฅผ ์์ฑ์ (Constructor) ๋ผ๊ณ ๋ถ๋ฅธ๋ค!
โ ์์ฑ์์ ์ด๋ฆ์ ๋ณ์์๋ ๋ค๋ฅด๊ฒ ๋๋ฌธ์๋ก ์์ํ๋ค.
โ ์์ฑ์์ prototype ์์ฑ์ ์๋ ์์ฑ๋๋ ๊ฐ์ฒด ์์ฑ์ด๋ค. ์ด ์์ฑ์๋ ์์ฑ์ ์์ ์ด ์ ์ฅ๋๋ค.
์ด๋ฅผ ํตํด, ์ด๋ค ๊ฐ์ฒด๊ฐ ์ด๋ค ์์ฑ์๋ก๋ถํฐ ์์ฑ๋์๋์ง ์์๋ผ ์ ์๋ค.
solmi.constructor === Person // true
Javascript์์ getter, setter ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ OOP์ ๊ธฐ๋ณธ ๊ฐ๋ ์ค ํ๋์ธ ์บก์ํ(encapsulation) ๋๋ฌธ์ด๋ค.
์บก์ํ๋? ์ผ๋จ ์ง๊ธ๊น์ง ์ดํดํ ๋ฐ๋ก๋, API๋ ๋ ธ์ถํ๋, ๋ด๋ถ ์ค๋ธ์ ํธ์ ์ฑ์ง์ ์ธ๋ถ์์ ์ง์ ๊ด์ฌํ์ง ๋ชปํ๊ฒ ๊ฐ์ถ๊ณ , ์ค์ง ์ค๋ธ์ ํธ๊ฐ ์ ๊ณตํ๋ ๋ฃจํธ๋ฅผ ํตํด์๋ง ๊ด์ฌํ ์ ์๊ฒ๋ ํ๋ ๊ฒ....์ด๋ค.์์ง์ ๋๋ฌด๋๋ฌด๋๋ฌดX99 ์ด๋ ค์ด ๊ฐ๋ ์ด๋ผ ์ฌ๊ธฐ์ ์ด๋ง ๋ง์ค์...ใ ใ OOP์ ๋ํด ๋ ๊ณ ๋ฏผํด๋ณด๊ณ , ๊ทธ ํ์ ๊ฐ์ฑํ๋ ์ถ์ํ ๋ฑ๋ฑ OOP์ ๊ฐ๋ ๋ค์ ์ข ์ ๋ฆฌํด๋ด์ผ๊ฒ ๋ค.
class User {
constructor {firstName, lastName, age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
get age() {
return this._age; //_age ๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ์ง๋ง constructor๋ console.log ๋ฑ์์๋ age๋ฅผ ์ด์ฉํ ์ ์๋ค. ๋ฐ๋ก ๋ด๋ถ์ ์ผ๋ก getter&setter๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ
}
set age(value) { // _age ์ ์ ์ฅ๋ ๊ฐ์ด 0๋ฏธ๋ง์ด๋ผ๋ฉด 0์ ์ฐ๊ณ , ์๋๋ผ๋ฉด ์ง์ ๋ value๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค.
this._age = value < 0 ? 0 : value;
}
}
const user1 = new User("steve", "jobs", -1);
console.log(user1.age); // 0 ์ถ๋ ฅ( user1์ age ๋ฅผ -1๋ก ์ง์ ํ์ง๋ง, getter&setter ์ค์ ๊ฐ ๋๋ฌธ์ 0์ด ์ถ๋ ฅ๋จ)
โ ์์งํ ์ด๊ฒ ๋ญ๋ง์ธ์ง @_@ ์ง์ง ๋๋ ์ด๋ ค์ด ๊ฐ๋ ์ด๋ผ ์ผ๋จ ์คํต....ใ ๋์ค์ OOP ์ ๋ฆฌํ๋ฉด์ ๋ค์ ๊ณต๋ถํด๋ด์ผ ๊ฒ ๋น
class Experiment {
publicField = 2;
#privateField = 0;
}
const experiment = new Experiment();
console.log(experiment.publicField); // 2 ์ถ๋ ฅ
console.log(experiment.privateField); // undefined ์ถ๋ ฅ
publicField
: ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅ
#privateField
: ์์ # ์ ๋ถ์ด๋ฉด class ๋ด๋ถ ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ. ์ธ๋ถ์์๋ ์์ ์ ์ปค๋
์ฝ์ ์๋ ์์.
์ต๊ทผ์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ด๋ผ, IE, ์ฌํ๋ฆฌ ๋ฑ์์ ์ง์๋์ง ์๋๋ค.
class Article {
static publisher = "Solmi";
constructor(articleNember) {
this.articleNumber = articleNumber;
}
static printPublisher() {
console.log(Article.publisher);
}
}
const article1 = new Article(1);
console.log(article1.publisher); // undefined ์ถ๋ ฅ
console.log(Article.publisher); // Solmi ์ถ๋ ฅ
object์ ์๊ด์์ด, class ์์ฒด์ ์ฐ๊ฒฐ๋ ๋ฉ์๋
์ฌ๋ฌ๊ฐ์ง ๋ค๋ฅธ object์ ๊ฐ๊ณผ๋ ๋ณ๊ฐ๋ก, ๋ชจ๋ object์ ๊ณต๋์ผ๋ก ์ ์ฉํ๊ณ ์ถ์ field๋ method๋ static
์ผ๋ก ์ง์ ํ ์ ์๋ค.
TypeScript ์์๋ ์์ฃผ ์ฌ์ฉ๋๋ค.
- ๋ค์ด์ค๋ data์ ์๊ด์์ด ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์
static
์ผ๋ก ์์ฑํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค.- ์ดํ๋ฆฌ์ผ์ด์ (application)์ ์ํ ์ ํธ๋ฆฌํฐ(utility) ํจ์๋ฅผ ์์ฑํ๋๋ฐ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์ต๊ทผ์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ด๋ผ, IE, ์ฌํ๋ฆฌ ๋ฑ์์ ์ง์๋์ง ์๋๋ค.
generator ๋ฉ์๋๋ฅผ ์ ์ํ๋ ค๋ฉด, ๋ฉ์๋ ์ด๋ฆ ์์ *
๊ธฐํธ๋ฅผ ๋ถ์ฌ์ค๋ค.
โ iterable ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํน๋ณํ ํํ์ ๋ฉ์๋์ด๋ฉฐ, Generator ํจ์์ ๋์ผํ๊ฒ ๋์ํ๋ค.
์์ธํ ๋ด์ฉ์ Iterable ์ ๋ํด ๊ณต๋ถํ ๋ ๋ ์์ธํ ์ ๋ฆฌ!!
ํ ํด๋์ค์ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ํด๋์ค์์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
class Parent { // ๋ถ๋ชจ ํด๋์ค or ์ํผ ํด๋์ค(superclass)
// ...
}
class Child extends Parent { // ์์ ํด๋์ค or ์๋ธ ํด๋์ค(subclass)
// ...
}
โ extends
ํค์๋๋ฅผ ํตํด Child
ํด๋์ค๊ฐ Parent
ํด๋์ค๋ฅผ ์์
์ด๋ฅผ '๋ถ๋ชจ ํด๋์ค-์์ ํด๋์ค ๊ด๊ณ' ํน์ '์ํผ ํด๋์ค(superclass)-์๋ธ ํด๋์ค(subclass) ๊ด๊ณ' ๋ผ๊ณ ๋ถ๋ฅธ๋ค!
ํด๋์ค ์์์ด ์ด๋ฃจ์ด์ง๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ผ์ด ๊ฐ๋ฅํ๋ค.
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 {} // ์์!
class Triangle extend Shape { // ๋คํ์ฑ!
draw() {
super.draw();
console.log("๐บ");
}
getArea() {
return (this.width * this.height) / 2;
}
}
const rectangle = new Rectangle(20, 20, "blue");
rectangle.draw(); // drawing blue color of ํธ์ถ
rectangle.getArea(); // 400
const triangle = new Triangle(20, 20, "red")
triangle.draw(); // drawing red color of + ๐บ 2๊ฐ๊ฐ ํธ์ถ
triangle.getArea(); // 200
์์ ํด๋์ค์ ๊ฐ์ ์ด๋ฆ์ ์์ฑ์ ์ ์ํ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์ ํธ์ถ๋์ง ์๋๋ค. ์ด ๋ super
๋ฅผ ์ด์ฉํด์ ๋ถ๋ชจ ํด๋์ค์ ์์ ํด๋์ค์ ์์๋ฅผ ๋ชจ๋ ํธ์ถํ ์ ์๋ค.
super
๋ฅผ ํจ์์ฒ๋ผ ํธ์ถํ๋ฉด, ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๊ฐ ํธ์ถsuper.prop
๊ณผ ๊ฐ์ด ์จ์ ๋ถ๋ชจ ํด๋์ค์ย prop
ย ์ ์ ์์ฑ์ ์ ๊ทผ ๊ฐ๋ฅsuper.prop
๊ณผ ๊ฐ์ด ์จ์ ๋ถ๋ชจ ํด๋์ค์ย prop
ย ์ธ์คํด์ค ์์ฑ์ ์ ๊ธ ๊ฐ๋ฅ์์ ์์ ์์ class Triangle extends Shape { }
์์ draw
๋ฉ์๋์ super.draw();
๋ก ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์ ํธ์ถํ๊ฒ์ด ์ด์ ํด๋นํ๋ค.
๋ถ๋ชจ ํด๋์ค์ ์กด์ฌํ๋ ํ๋๋ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
์์ ์์ ์์ class Triangle extend* Shape { }
์์ Triangle๋ง์ ๋์ด ๊ณ์ฐ๋ฒ๊ณผ ๐บ๋ฅผ ์ถ๋ ฅํ๋๊ฒ์ ์ฌ์ ์ํด ์ค๊ฒ์ด ๋คํ์ฑ-์ค๋ฒ๋ผ์ด๋ฉ์ ํด๋นํ๋ค.
console.log(rectangle instanceof Rectangle); // true
console.log(triangle instanceof Shape); // true
console.log(triangle instanceof Object); // true
console.log(triangle instanceof Rectangle); // false
instanceof
์ผ์ชฝ์ ์๋ object๊ฐ instanceof
์ค๋ฅธ์ชฝ์ ์๋ class ์ instance ๊ฐ ๋ง๋์ง checking
console.log(triangle instanceof Shape);
triangle์ Triangle์ instance์ด๊ณ , Triangle์ Shape๋ฅผ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ true!
console.log(triangle instanceof Object);
javascript ์์ ๋ง๋ ๋ชจ~~๋ class๋ javascript์ Object๋ฅผ ์์๋ฐ์ ๊ฒ์ด๋ค!
โ VScode์์ command ํค๋ฅผ ๋๋ฅธ ์ฑ๋ก Object
๋ฅผ ํด๋ฆญํด๋ณด๋ฉด ์ด๋ฏธ ์ ์๋ Object ๋ฅผ ๋ณผ ์ ์๋น!!