μ½λ°± ν¨μ / νμ΄ν ν¨μ / class μ μΈ / object μμ± / class μμ± / μμ & λ€μμ± νμ΅
μλ°μ€ν¬λ¦½νΈ κ°μ μκ° (ν¨μ, class)
λ¬Έμμ΄ λ©μλ νμ΅ - [TIL] 210901 μ°Έκ³
λλ¦Όμ½λ© μ νλΈ 'μλ°μ€ν¬λ¦½νΈ' κ°μ 5, 6νΈ
μ½λ©μ ν μ νλΈ 'κ°μ²΄μ§ν₯ Class λ¬Έλ² 10λΆλ§μ μ΄ν΄μμΌμ€ (μλ°μ€ν¬λ¦½νΈ)'
μ¬μ νμ΅ κ°μ΄λ STEP 2 string λ¬Έμμ΄ λ©μλ
맀κ°λ³μμ μ μλ ν¨μλ€ μ€ μν©μ λ§λ ν¨μλ₯Ό νΈμΆνλ ν¨μ
const printYes = function () { console.log('Yes'); } // 1. printYesλΌλ λ³μμ ν¨μ ν λΉ const printNo = function hey () { console.log('No'); } // 2. printNoλΌλ λ³μμ ν¨μ ν λΉ function random(answer, printYes, printNo) { if (answer === 'happy') { printYes(); } else { printNo(); } } // μ½λ°± ν¨μ μ μ random('happy', printYes, printNo); // No // μΈμλ₯Ό 맀κ°λ³μμ μ λ¬ν΄μ£Όλ©΄μ ν¨μ νΈμΆ
μ£Όμ β
- μ½λ°± ν¨μμμ
(answer, printYes, printNo)
λ κ·Έ μμ²΄λ‘ ν¨μ μ΄λ¦μ΄ μλλΌ ν¨μκ° ν λΉλλ³μ
μ΄λ€. (1, 2. μ½λ 지 λ μ£Όμν κ²)
- 2.μμ ν¨μ μ΄λ¦μ μ§μ ν μ΄μ λ λλ²κΉ ν λ μ€ν μΆμ (stack trace)μ ν¨μ μ΄λ¦μ΄ λμ€λλ‘ νκΈ° μν¨μ΄λ€.
κ°κ²°νκ² ννν ν¨μ
function
ν€μλμ { }
μ λΉΌκ³ , ν μ€μ κ°κ²°νκ² μ μ μ μλ€
const simplePrint1 = function () { console.log('simplePrint1'); } // μ΄κ±Έ νμ΄ν ν¨μλ‘ νννλ©΄ const simplePrint2 = () => console.log('simplePrint2');
const add1 = function (a, b) { return a + b; } // μ΄κ±Έ νμ΄ν ν¨μλ‘ νννλ©΄ const add2 = (a, b) => a + b;
{ }
μ μ¬μ©ν μλ μλ€.const simpleMultiply = (a, b) => { // do somthing more return a + b; };
μλλ ν¨μλ₯Ό μ μΈνκ³ κ·Έ λ°μ foo(); λΌλ μμΌλ‘ ν¨μλ₯Ό νΈμΆν΄μ€μΌ νλ€
κ·Έλ¬λ κ΄νΈλ₯Ό 2λ² μ¬μ©ν΄
ν¨μλ₯Ό μ μΈν¨κ³Ό λμμ νΈμΆν μ μλ€.
(function IIFE () { console.log('IIFE'); })(); // IIFE
function calculate (command, a, b) { // 1μ ꡬν switch (command) { case 'add': // 2λ₯Ό ꡬν return a + b; case 'substract': return a - b; case 'divide': return a / b; case 'multiply': return a * b; case 'reminder': return a % b; default: // 3μ ꡬν throw Error('unknown command'); } } console.log(calculate(`add`, 2, 3)); // 5
- λ°μ΄ν°λ λ€μ΄ μμ§ μκ³ , μ΄λ° λ°μ΄ν°λ€μ΄ λ€μ΄κ° μ μλ€κ³
ν
λ§ μ‘μλμ κ²ν λ²λ§
μ μΈν΄μ€λ€- μ μλ§ ν κ²μ΄κΈ°μ μ€μ λ‘ λ©λͺ¨λ¦¬μ ν λΉλμ§λ μλλ€
- classμ
λ°μ΄ν°
λ₯Ό λ£μ κ²- classλ₯Ό μ΄μ©ν΄
μ¬λ¬ λ²
μμ± κ°λ₯- μ€μ λ‘ λ©λͺ¨λ¦¬μ ν λΉλλ€
κ΄λ ¨ μλ λ³μλ ν¨μλ€μ λ¬Άμ΄λμ κ²
λ³μ : μμ±(μν) : fields
ν¨μ : νλ : methods
λΉμ·ν objectλ₯Ό λ§μ΄ λ§λ€ μΌμ΄ μμ λ, classλ₯Ό μ μΈνλ©΄ objectλ₯Ό μ½κ² λ§μ΄ μμ±ν μ μλ€.
λ°μ΄ν° class
: μμ±(fields)μ μκ³ νλ(methods)λ§ μλ class
μΊ‘μν
(encapsulation) : λ΄λΆμ μΌλ‘λ§ λ³Ό μ μλ λ³μμ λ°κΉ₯μμλ λ³Ό μ μλ λ³μλ‘ λλλ€
classλ₯Ό μ΄μ©ν΄ μμ
κ³Ό λ€μμ±
μ΄ μΌμ΄λ μ μλ€
β μ΄ λͺ¨λ κ²λ€μ javascriptκ° κ°μ²΄ μ§ν₯ μΈμ΄μ΄κΈ° λλ¬Έμ κ°λ₯ν κ²μ΄λ€
class Person { // μμ±μ(constructor) constructor(name, age) { // μμ±(fields) this.name = name; // μλ‘ μμ±λλ objectμ {name: name}μ μΆκ°ν΄λΌ this.age = age; } //νλ(mothods) speak() { console.log(`${this.name}: hello!`); } }
κ°λ μ 리 β
class μ΄λ¦
: κ΄μ΅μ μΌλ‘ λλ¬Έμμμ±μ
(constructor) : objectλ₯Ό λ§λ€ λ νμν λ°μ΄ν°κ° μ λ¬λ¨this
: PersonμΌλ‘λΆν° μμ±λλ object (μ¦, instance)μμ±
(fields),νλ
(methods) : μ λ¬λ λ°μ΄ν°κ° ν λΉλ¨
const honey = new Person('syong', 20); // μμ μλλ κ°μ λ΄μ©μ΄λ€. μλ 4μ€ μΈ κ²μ 1μ€μ λ΄μ μ μλ€. const honey = { name : 'syong', age : 20 } console.log(honey.name); // syong console.log(honey.age); // 20 honey.speak(); // syong: hello! honey.speak(); // syong: hello!
κ°λ μ 리 β
- μλ‘μ΄ objectλ₯Ό λ§λ€ λ
new
λΌλ ν€μλ μ¬μ©
κ°μ²΄κ° κ°μ§ νλ‘νΌν° κ°μ, κ°μ²΄ λ°κΉ₯μμ μ½κ±°λ μ°κΈ° μν΄ μ¬μ©λ¨
νλ‘νΌν°λ₯Ό μ½κ³ μ
ν λ μ€νλλ€
getμ΄λΌλ ν€μλλ₯Ό μ΄μ©ν΄ κ°μ return ν μ μλ€
νλ‘νΌν°μ κ°μ ν λΉνκ³ μ
ν λ μ€νλλ€
setμ΄λΌλ ν€μλλ₯Ό μ΄μ©ν΄ κ°μ μ€μ νλ―λ‘ 'value'λ₯Ό λ°μμμΌ νλ€
ex) age κ°μ΄ -1μΈ κ²½μ°, console μ°½μ λ€λ₯Έ κ°μ λμμ€λ€
class User { constructor(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } // getter get age() { return this._age; // get age()λ₯Ό νΈμΆνλ©΄ this.ageλ₯Ό return νκ² λλ€ } // setter set age(value) { if (value <0) { throw Error('λμ΄λ μμμΌ μ μλ€') } this._age = value; // μλ‘μ΄ valueλ₯Ό λ°μΌλ©΄ κ·Έ valueλ₯Ό this.ageμ ν λΉνκ² λλ€ } } const user1 = new User('Steve', 'Jobs', -1); console.log(user1.age); // 'λμ΄λ μμμΌ μ μλ€'λ 문ꡬμ errorκ° λΈ
β» setter μμμμ if 쑰건문μ μ§μ°κ³ ,
this._age = value;
λ₯Όthis._age = value < 0 ? 0 : value;
λ‘ λ°κΏ μλ μλ€
getter, setter μμ λ³μ
λ ageλΌκ³ λκ°μ΄ μ°λ©΄ μλλ€
age()λΌλ getterλ₯Ό μ μνλ μκ°, this.ageλ λ©λͺ¨λ¦¬μ μλ λ°μ΄ν°λ₯Ό μ½μ΄μ€λ κ² μλλΌ getterλ₯Ό νΈμΆνκ² λλ€
age()λΌλ setterλ₯Ό μ μνλ μκ°, κ°μ ν λΉν λ λ°λ‘ λ©λͺ¨λ¦¬μ μλ κ°μ ν λΉνλ κ² μλλΌ setterλ₯Ό νΈμΆνκ² λλ€
μ¦, μ λ¬λ valueλ₯Ό this.ageμ ν λΉν λ λ©λͺ¨λ¦¬μ κ°μ μ
λ°μ΄νΈ νλ κ² μλλΌ setterλ₯Ό νΈμΆνκ² λλ€
μ μμ μμλ 1, 2λ₯Ό λ°©μ§νκΈ° μν΄ getterμ setter μμμ μ°μ΄λ λ³μ μ΄λ¦μ _λ₯Ό μΆκ°ν΄ λ³νλ₯Ό μ£Όμλ€
κ²°κ³Όμ μΌλ‘ UserλΌλ ν¨μ μμμ λ³μκ° μ΄ 3κ°(firstName, lastName, _age) μκ² λλ€
class μΈλΆμμλ μ κ·Ό κ°λ₯
class λ΄λΆμμλ§ μ κ·Ό κ°λ₯, μΈλΆμμλ κ°μ μ½μ μλ λ³κ²½ν μλ μλ€
classλ₯Ό μ μΈν λ constructorμ μ°μ§ μκ³ , λ°λ‘ fieldsλ₯Ό μ μ μ μλ€
μ΄λ field μμ #λ₯Ό λΆμ΄λ©΄
private fieldκ° λλ€
class Sprite { pubilcField = 2; #privateField = 0; } const coke = new Sprite (); console.log(coke.pubilcField); // 2 console.log(coke.privateField); // undefined
objectμ λ°μ΄ν°μ μκ΄μμ΄
classμμ 곡ν΅μ μΌλ‘ λ°λ³΅λμ΄ μ°μ΄λ μμ±μ΄λ λ©μλ μμ static
μ λΆμ¬μ€λ€
staticμ objectλ§λ€ ν λΉλλ κ²μ΄ μλκ³ class μ체μ λΆμ΄μλ
κ²μ΄λ€
κ·Έλ¬λ―λ‘ μλ‘ λ§λ€μ΄μ§ objectμ static μμ±κ°μ΄λ λ©μλλ₯Ό κ°μ Έμ€κΈ° μν΄μλ κ·Έ objectμ μ΄λ¦μ΄ μλλΌ class μ΄λ¦
μ μ΄μ©ν΄μΌ νλ€
class Article { static publisher = 'song'; construnctor(articleNumber) { this.articleNumber = articleNumber; } static printPublisher() { console.log(Article.publisher); } } const article1 = new Article(1); console.log(Article.publisher); // song β console.log(Article1.publisher) νλ©΄ undefined λμ΄ Article.printPublisher(); // song β Article1.printPublisher() νλ©΄ undefined λμ΄
extends
λΌλ ν€μλλ₯Ό μ΄μ©νλ©΄ 곡ν΅λλ μμ±κ³Ό λ©μλ
λ€μ λ§€λ² μΌμΌμ΄ μμ±νμ§ μκ³ λ νΈνκ² μ¬μ¬μ©ν μ μλ€.
ex) λν λ§λ€κΈ° (μ¬κ°ν, μΌκ°ν)
class Shape { constructor (width, height, color) { this.width = width; this.height = height; this.color = color; } draw () { console.log(`drawing ${this.color} color of`); } } // μ¬κ°ν class Rectangle extends Shape {} // extends ν€μλλ₯Ό μ΄μ©ν΄ Shapeμ μμ±κ³Ό λ©μλλ€μ Rectangleμ κ·Έλλ‘ κ°μ Έμ΄ (μμ) const rectangle = new Rectangle (20, 20, 'blue'); rectangle.draw(); // drawing blue color of // μΌκ°ν class Triangle extends Shape {} const triangle = new Triangle (20, 20, 'red'); triangle.draw(); // drawing red color of
νμν ν¨μλ§ μ¬μ μ
(overriding)ν΄μ μ¬μ©ν μ μλ€.
ex) μ¬κ°ν λμ΄ β μΌκ°ν λμ΄
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 extends Shape { draw() { super.draw(); // λΆλͺ¨μ draw() λ©μλ νΈμΆ console.log('β€'); // μ¬μ μ(overriding) } getArea() { return (this.width * this.height) / 2; // μ¬μ μ(overriding) } } // μ¬κ°ν const rectangle = new Rectangle (20, 20, 'blue'); rectangle.draw(); // drawing blue color of console.log(rectangle.getArea()); // 400 // μΌκ°ν const triangle = new Triangle (20, 20, 'red'); triangle.draw(); // drawing red color of β€ console.log(triangle.getArea()); // 200
ννΈ,
βdraw() λ©μλ
λrectangle.draw();
λΌκ³ μ³λ κ°μ΄ λμ¨λ€.
βgetArea() λ©μλ
λconsole.log(triangle.getArea());
λΌκ³ μ³μΌ κ°μ΄ λμ¨λ€.
instanceOf
μΌμͺ½μ μλ objectκ° μ€λ₯Έμͺ½μ μλ classλ₯Ό μ΄μ©ν΄ λ§λ€μ΄μ§ object, μ¦ instanceμΈμ§ μλμ§λ₯Ό νμΈν΄μ£Όλ μ°μ°μ
true νΉμ falseλ‘ returnνλ€
console.log(triangle instanceof Triangle); // true console.log(triangle instanceof Shape); // true console.log(triangle instanceof Object); // true
π‘ 3λ²μ§Έ μ€ μ€λͺ
- μλ°μ€ν¬λ¦½νΈμμ λ§λ λͺ¨λ object/classλ€μ μλ°μ€ν¬λ¦½νΈμ μλ objectλ₯Ό
μμ
ν κ²μ΄λ€.- λ°λΌμ μλ°μ€ν¬λ¦½νΈμμ λ§λ λͺ¨λ objectλ€μ μλ°μ€ν¬λ¦½νΈμ μλ Objectμ
λ©μλ
λ€μ κ°μ Έμμμ¬μ μ
ν μ μλ€.
(VS codeμμ object μμ ctrl/command λλ₯΄κ³ ν΄λ¦νλ©΄ λ©μλ νμΈ κ°λ₯)
λ Έλ§λ μ½λ μ νλΈ 'λ°λλΌ μλ°μ€ν¬λ¦½νΈ' κ°μ 1-10(object) μκ°
λλ¦Όμ½λ© μ νλΈ 'μλ°μ€ν¬λ¦½νΈ' κ°μ 7νΈ(object) μκ°