[2] Class와 Object

NaakiteΒ·2022λ…„ 2μ›” 7일
0

πŸ“λ“œλ¦Όμ½”λ”© JavaScript

λͺ©λ‘ 보기
2/6
post-thumbnail

βœ… κ°•μ˜ μ‹œμž‘λΆ€λΆ„μ—μ„œ ν΄λž˜μŠ€μ™€ 였브젝트의 차이점을 뢕어빡에 λΉ„μœ ν•΄μ„œ μ„€λͺ…ν•˜μ…¨λŠ”λ°, μ•„μ£Ό μ‰½κ²Œ μ΄ν•΄λ˜μ—ˆλ‹€..πŸ‘
ν΄λž˜μŠ€λŠ” 뢕어빡을 λ§Œλ“œλŠ” 틀이라고 μƒκ°ν•˜λ©΄, μ˜€λΈŒμ νŠΈλŠ” 뢕어빡이라고 μƒκ°ν•˜λ©΄ λ˜λŠ”λ°, 클래슀 μžμ²΄μ—λŠ” 데이터가 λ“€μ–΄μžˆμ§€ μ•Šκ³ , ν…œν”Œλ¦Ώλ§Œ μ •μ˜ν•΄ λ†“λŠ”λ‹€! 이런 클래슀λ₯Ό μ΄μš©ν•΄μ„œ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ μ˜€λΈŒμ νŠΈκ°€ λœλ‹€! (λΆ•μ–΄λΉ΅ 틀을 μ΄μš©ν•΄μ„œ μž¬λ£Œμ— 따라 μ—¬λŸ¬ μ’…λ₯˜μ˜ λΆ•μ–΄λΉ΅ 탄생!)

βœ… 클래슀 κΈ°λ³Έ ꡬ쑰

class Person {
    constructor(name, age) { // μΈμŠ€ν„΄μŠ€ 생성 및 μ΄ˆκΈ°ν™”
        //fields
        this.name = name;
        this.age = age;
    }
    //methods
    speak() {
        console.log(`${this.name}: hello`)
    }
}

πŸ“ constructor 은 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•œ νŠΉμˆ˜ν•œ λ©”μ„œλ“œμ΄λ©°, 클래슀 내에 μ΅œλŒ€ ν•œκ°œλ§Œ μ‘΄μž¬ν•  수 μžˆλ‹€. constructor λ‚΄λΆ€μ˜ thisλŠ” ν΄λž˜μŠ€κ°€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킨닀. constructor 은 μƒλž΅ ν•  수 μž‡λŠ”λ°, constructor 을 μƒλž΅ν•˜μ—¬λ„, μ•”λ¬΅μ μœΌλ‘œ ν΄λž˜μŠ€μ— 빈 constructor κ°€ μ •μ˜λœλ‹€. (즉 constructor을 μƒλž΅ν•œ ν΄λž™μŠ€λŠ” 빈 constructor 에 μ˜ν•΄ 빈 객체가 μƒμ„±λœλ‹€.) 또, constructor μ•ˆμ—λŠ” return 문을 μ‚¬μš©ν•  수 μ—†λŠ”λ°, constructor λ‚΄λΆ€μ—μ„œλŠ” μ•”λ¬΅μ μœΌλ‘œ this, 즉 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
(this 에 λŒ€ν•΄μ„œλŠ” 좔후에 μžμ„Ένžˆ 곡뢀할 μ˜ˆμ •μ΄λ‹€.)


βœ… Getter, Setter

class User {
    constructor(firstName, lastName, age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
   get age() {
      return this._age;
   }
   set age(value) {
       this._age = value < 0? 0 : value; 
       // age에 μ‚¬μš©μžκ°€ μ‹€μˆ˜λ‘œ  음수둜 μ„€μ •ν•˜λ©΄ 0으둜 λ‹€μ‹œ μ„€μ •λœλ‹€.
   }
}
const user1 = new User('Steve', 'Job', -1); 
// μ‚¬μš©μžκ°€ μ‹€μˆ˜λ‘œ λ‚˜μ΄λ₯Ό -1둜 μ„€μ •ν–ˆλ‹€κ³  κ°€μ •ν•˜μž.
// μ΄λŸ¬ν•œ μ‹€μˆ˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ getter, setter λ₯Ό μ‚¬μš©ν•œλ‹€!

πŸ“μ—¬κΈ°μ„œ μ£Όμ˜ν•΄μ•Όν•  것이 μžˆλŠ”λ°, getter κ³Ό setter μ•ˆμ— μžˆλŠ” λ³€μˆ˜λ“€μ„ 보면 ν•„λ“œμ™€ λ‹€λ₯΄κ²Œ μ •μ˜λ˜μ—ˆλ‹€.
this.age λŒ€μ‹ μ— this._age둜 λ˜μ—ˆλŠ”λ°, λ§Œμ•½ _age κ°€ μ•„λ‹Œ ν•„λ“œμ™€ λ˜‘κ°™μ΄ μ •μ˜ν•œλ‹€λ©΄, λ¬΄ν•œλ£¨ν”„μ— λΉ μ§€κ²Œ λœλ‹€. κ·Έ μ΄μœ μ— λŒ€ν•΄ μž μ‹œ μ‚΄νŽ΄λ³΄μž!

const user1 = new User('Steve', 'Job', -1);
// user1.firstName = 'Steve'
// user1.lastName = 'job'
// user1.age = -1

μ—¬κΈ°μ„œ user.age λŠ” setter ν•¨μˆ˜κ°€ μžλ™μ μœΌλ‘œ μ‹€ν–‰λ˜λŠ”λ°, μ΄λ•Œ λ§Œμ•½ setter ν•¨μˆ˜μ˜ λ³€μˆ˜κ°€ this.age 라면, κ²°κ΅­ user1.age κ°€ λ˜λŠ” 것이기 λ•Œλ¬Έμ—, 이 user1.age λŠ” 또 setter ν•¨μˆ˜λ₯Ό μžλ™μ μœΌλ‘œ μ‹€ν–‰μ‹œν‚€κ²Œ λ˜λ―€λ‘œ λ¬΄ν•œλ£¨ν”„μ— λΉ μ§€κ²Œ λ˜λŠ” 것이닀. 그렇기에 λ³€μˆ˜λ₯Ό λ³€κ²½ν•΄μ•Ό ν•œλ‹€!


βœ… Object 생성

const ellie = new Person('ellie', 20);
ellie.speak(); //ellie: hello!

βœ… 상속과 μ˜€λ²„λΌμ΄λ”©

πŸ‘ 상속은 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°œλ…μ΄λ‹€!
κ°„λ‹¨νžˆ μ •μ˜ν•˜μžλ©΄, μ–΄λ–€ 객체의 ν”„λ‘œνΌν‹° ν˜Ήμ€ λ©”μ„œλ“œλ₯Ό λ‹€λ₯Έ 객체가 상속받아 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λŠ” 것!
μƒμ†μ΄λΌλŠ” κ°œλ…μ„ λ“£μž CSSμ—μ„œλ„ μ‚¬μš©ν•œ 기얡이 λ– μ˜¬λžλ‹€.

position: relative; // λΆ€λͺ¨
position: absolute; // μžμ‹

CSS μ—μ„œ μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό 지정할 λ•Œ, λΆ€λͺ¨μ™€ μžμ‹κ΄€κ³„λ₯Ό μ΄μš©ν•˜μ—¬, λΆ€λͺ¨κΈ°μ€€μ—μ„œ μžμ‹μ˜ μœ„μΉ˜λ₯Ό μ„€μ •ν•  수 μžˆλ‹€. 이처럼 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 상속 κ°œλ…μ—μ„œλ„ λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ 클래슀둜 κ΅¬λΆ„λ˜μ–΄μ§„λ‹€.

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 width * this.height;
    }
}

class Rectangle extends Shape {} // μžμ‹ 클래슀

Rectangle ν΄λž˜μŠ€λŠ” extends둜 λΆ€λͺ¨ 클래슀인 Shapeλ₯Ό 상속 λ°›μŠ΅λ‹ˆλ‹€.
그런데 λ§Œμ•½, λΆ€λͺ¨ 클래슀λ₯Ό 상속 λ°›μ§€λ§Œ, ν•„μš”ν•œ κΈ°λŠ₯λ“€λ‘œ λ‹€μ‹œ μž¬μ •μ˜λ₯Ό ν•˜κ³  μ‹ΆμœΌλ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ? 이것을 μ˜€λ²„λΌμ΄λ”©μ΄λΌκ³  λΆ€λ₯΄λŠ”데, μ˜€λ²„λΌμ΄λ”©μ€ μƒμœ„ ν΄λž˜μŠ€κ°€ 가지고 μžˆλŠ” λ©”μ„œλ“œλ₯Ό ν•˜μœ„ ν΄λž˜μŠ€κ°€ μž¬μ •μ˜ ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방식을 λœ»ν•œλ‹€.

class Triangle extends Shape { // ν•„μš”ν•œ ν•¨μˆ˜λ§Œ μž¬μ •μ˜ -> μ˜€λ²„λΌμ΄λ”©
    draw() {
        console.log('πŸ”Ί');
    } 
    getArea() {
        return (this.width * this.height) / 2;
    }
}

const triangle = new Triangle(20,20,'red'); 
triangle.draw();                    // πŸ”Ί
console.log(triangle.getArea());    // 200

λ§Œμ•½ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ draw() ν•¨μˆ˜λ„ μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ?

draw() {
        super.draw(); // λΆ€λͺ¨ν΄λž˜μŠ€μ˜ draw() ν•¨μˆ˜λ„ 같이 ν˜ΈμΆœλœλ‹€.
        console.log('πŸ”Ί');
    }
// 좜λ ₯은  'drawing red color of πŸ”Ί' 이 될것이닀.     
    

βœ… Class checking: instanceOf

instanceOfλŠ” Aκ°€ B의 instance인지 등에 λŒ€ν•΄ 확인할 수 μžˆλŠ” μ—°μ‚°μžμ΄λ‹€.

console.log(rectangle instanceof Rectangle); // true 와 false λ₯Ό 호좜. -> true
console.log(rectangle instanceof Shape); // true
console.log(rectangle instanceof Object); // true

λ“œλ¦Όμ½”λ”© κ°•μ˜λ₯Ό λ“£κ³  μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.πŸ‘

profile
πŸ‘©β€πŸ’»πŸƒβ€β™€οΈ

0개의 λŒ“κΈ€