๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JS

[JavaScript ๋ฌธ๋ฒ•] : Class์˜ ์ƒ์†(= Inheritance)

by ๊ถŒ์Šพํ–„ 2023. 5. 26.

์˜ค๋Š˜์€ Class์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„.

"์ƒ์†" = Inheritance

Start !

๊ตฌ๊ธ€์— ์•Œ๋งž์€ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์–ด์„œ ๊ฐ€์ ธ์™€ ๋ดค์Šต๋‹ˆ๋‹ค.

Class๋Š” ๋…๋‹จ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ถ€๋ชจ Class, ์ž์‹ Class, ์†์ž Class ์ด๋Ÿฐ์‹์œผ๋กœ ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ถ€๋ชจClass ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•„์ˆ˜์š”์†Œ(= property) ๋˜๋Š” ๋ฉ”์„œ๋“œ(= method) ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์„

๋ฐ‘์œผ๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ => ์ƒ์†(= inheritance) ์ด๋‹ค.


์˜ˆ๋กœ, ์—ฌ๋Ÿฌ๊ฐ์ฒด์˜ Animal์„ ๋งŒ๋“ค์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„ค๊ณ„๋„(= class) ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด,

animal ์ค‘์—์„œ๋„

dog ๋ผ๋Š” ๊ฐ์ฒด๋งŒ ๋งŒ๋“ค์–ด๋‚ด๋Š” class๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ ,

cat ์ด๋ผ๋Š” ๊ฐ์ฒด๋งŒ ๋งŒ๋“ค์–ด๋‚ด๋Š” class๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

โ€‹

๊ทธ๋Ÿด ๋•Œ !! ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์†์„ฑ ์ค‘ ํ•˜๋‚˜์ธ '์ƒ์†'์„ ์ด์šฉํ•œ๋‹ค๋ฉด,

class dog ๋˜๋Š” class cat ์— ๊ฐ๊ฐ ๋”ฐ๋กœ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ์–ด๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


์˜ˆ๋ฅผ ๋“ค์ž๋ฉด,

โ€‹

animal ์ด๋ผ๋Š” class ์— name ๊ณผ age๋ฅผ 'ํ•„์ˆ˜์š”์†Œ' ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ ,

dog ๋ผ๋Š” ์ƒˆ๋กœ์šด class ์—๋„ name ๊ณผ age ๊ฐ€ 'ํ•„์ˆ˜์š”์†Œ'๋กœ ๋“ค์–ด๊ฐˆ ์˜ˆ์ •์ด๋ผ๋ฉด ~!

โ€‹

์šฐ๋ฆฌ๋Š” class Dog ์— constructor(= ์ƒ์„ฑ์ž ํ•จ์ˆ˜)๋ฅผ ๋‹ค์‹œ ์จ ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.

โ€‹

์šฐ์„ , ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด animal class๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.


class Animal {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    sayHi() {
        console.log(`๋‚ด ์ด๋ฆ„์€ ${this.name} ์ด๊ณ , ๋‚˜์ด๋Š” ๋ฏธ์šด ${this.age} ์งค >_< `);
    }
}

name ๊ณผ age๊ฐ€ property ๊ณ , sayHi ๋ผ๋Š” method ๋ฅผ ๊ฐ–๋Š” Animal ์ด๋ผ๋Š” class ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค.

๋จผ์ €, ์œ„ ์ฝ”๋“œ๊ฐ€ ์งœ์—ฌ์ง„๋Œ€๋กœ ๊ฐ์ฒด์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ž˜ ๊ตฌํ˜„ํ•ด ๋‚ด๋Š”์ง€ ํ™•์ธํ•ด ๋ณธ๋‹ค.

const animal1 = new Animal('์ถ˜์‹์ด', 7);
const animal2 = new Animal('ํ™ฉ์ง„์ด', 8);

console.log(animal1);
console.log(animal2);
animal1.sayHi();
animal2.sayHi();

์ด๋ ‡๊ฒŒ ํ™•์ธํ•ด๋ณด๋ฉด,

์ •์ƒ์ ์œผ๋กœ ๋‚ด๊ฐ€ ๋„ฃ์€ property ์™€ method ๋Œ€๋กœ animal ์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š”๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.


์—ฌ๊ธฐ์„œ, ์œ„์™€ ๊ฐ™์€ property, method ๋ฅผ ๊ฐ€์ง„ Dog ๋ผ๋Š” class๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•œ๋‹ค๋ฉด,

์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๋‹ค.

class Animal {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    sayHi() {
        console.log(`๋‚ด ์ด๋ฆ„์€ ${this.name} ์ด๊ณ , ๋‚˜์ด๋Š” ๋ฏธ์šด ${this.age} ์งค >_< `);
    }
}

class Dog extends Animal {}

์›๋ž˜ ์žˆ๋˜ ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•œ๊ฒƒ์€ " class Dog extends Animal " <-- ์ด ํ•œ ์ค„ ๋ฐ–์— ์—†๋‹ค.

์ด๊ฒƒ ๋งŒ์œผ๋กœ๋„ Dog ๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

const cuteDog = new Dog('๋˜˜์ด', 3);
const prettyPuppy = new Dog('์˜ˆ์‚', 2);

console.log(cuteDog);
console.log(prettyPuppy);
cuteDog.sayHi();
prettyPuppy.sayHi();

์ด๋ ‡๊ฒŒ ํ™•์ธํ•˜๋ฉด,

Dog ๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ sayHi ๋ผ๋Š” method ๊นŒ์ง€ ๊ฐ€์ง„์ฑ„๋กœ ์ƒ์„ฑ์ด ์ž˜ ๋˜์—ˆ๋‹ค.


์ด๋ ‡๊ฒŒ ์ƒ์œ„ Class ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ƒ์†๋ฐ›์•„ ํ•˜์œ„ Class ๋“ค์ด ๋ฌผ๋ ค๋ฐ›๋Š” ๊ฒƒ์„ ์ƒ์†์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ด ์ƒ์†์—์„œ ๊ธฐ์–ตํ•ด์•ผ ํ•  ํ‚ค์›Œ๋“œ๋Š” 'extends' ์™€ 'super()' ๊ฐ€ ์žˆ๋‹ค.

โ€‹

1. extends : ์‚ฌ์ „์  ์˜๋ฏธ๋Š” ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™๋‹ค.

์‚ฌ์šฉ๋ฒ•์€ ์œ„ ์ฝ”๋“œ์—์„œ ๋ณด๋Š”๋ฐ”์™€ ๊ฐ™์ด,

1). ์ƒˆ๋กœ ๋งŒ๋“ค class ์˜ ๊ฐ์ฒด ๋ช… ์˜†์— extends ๋ฅผ ์จ์ฃผ๊ณ 

2). extends ๋‹ค์Œ์—๋Š” ๋ฌผ๋ ค๋ฐ›์„ ์ƒ์œ„ class ๋ช…์„ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

โ€‹

๊ทธ๋Ÿฌ๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ property ์™€ method ๋ฅผ ์ƒ์†๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋งŒ๋“ค์–ด ์ง€๋Š” ๊ฒƒ์ด๋‹ค.


2. super()

์‚ฌ์šฉํ•  ๋•Œ : ๋ถ€๋ชจ class ๋กœ ๋ถ€ํ„ฐ ์ƒ์† ๋ฐ›์„ property ์ค‘์—, ์‚ญ์ œ ๋˜๋Š” ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ property ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ.

*์ƒˆ๋กœ์šด ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ method ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” super() ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ,

Dog class ์˜ {}์•ˆ์— ์œ„์˜ sayHi ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


๋‚˜๋Š” ๋ถ€๋ชจ class ์—๋Š” ์—†๋Š”,

"gender" ๋ผ๋Š” porperty ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ๋‹ค.

์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค.

 

class Animal {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    sayHi() {
        console.log(`๋‚ด ์ด๋ฆ„์€ ${this.name} ์ด๊ณ , ๋‚˜์ด๋Š” ๋ฏธ์šด ${this.age} ์งค >_< `);
    }
}

class Dog extends Animal {
    constructor(name, age, gender) {
        super(name, age);
        this.gender = gender;
    }
}

์ƒˆ๋กœ์šด ์ƒ์„ฑ์žํ•จ์ˆ˜, constructor ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , () ์•ˆ์— ์ถ”๊ฐ€ํ•  "gender" ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ ๋‹ค์Œ {} ์•ˆ์—๋Š” super() ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š”๋ฐ,

super() ๋Š” constructor ์™€ ๊ฐ™๋‹ค,

๋‹ค๋งŒ ์—ฌ๊ธฐ์„œ super ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์€ Dog ๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ,

Animal์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๊ทธ๋ž˜์„œ super ์˜ () ์•ˆ์—๋Š” Animal ์˜ property ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

โ€‹

๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€์–ด ์„ค๋ช…ํ•ด๋ณด๋ฉด,

์—„๋งˆ ! ๋‚˜๋Š” constructor(name, age, gender) ์ด๋Ÿฐ Dog๋ฅผ ๊ฐ€์ง€๊ณ  ์‹ถ์–ด ~

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์—„๋งˆ๊ฐ€ ๋ฌผ๋ ค์ค€ super(name, age) ๋Š” ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ณ , ๋‚˜๋Š” gender ๋งŒ ์ถ”๊ฐ€ํ•ด์„œ ๋งŒ๋“ค๊ฒŒ ~ !!

๋ผ๊ณ , ์œ„์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.


์ˆœ์„œ

1. constructor ๋ฅผ ๋„ฃ์–ด์„œ property๋ฅผ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œ, ๋ณ€๊ฒฝ ํ•ด์ค€๋‹ค.

2. super ๋ฅผ ํ†ตํ•ด์„œ ์ƒ์œ„ ํด๋ž˜์Šค์— ์•Œ๋ ค์ค€๋‹ค.

3. ๊ทธ ๋‹ค์Œ์— this.gender ๋กœ ๊ฐ์ฒด์ง€์ •์„ ํ•ด์ค€๋‹ค.

โ€‹

super() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์œ ์˜ํ•  ์  :

1. super ๋ฅผ constructor, ์ƒ์„ฑ์ž ํ•จ์ˆ˜ {}๋‚ด๋ถ€์— ์จ์ค˜์•ผ ํ•˜๊ณ ,

2. ์ƒˆ๋กœ์ด ์ถ”๊ฐ€ํ•œ property ๋ฅผ this ๋กœ ์ง€์ •ํ•ด์ฃผ๊ธฐ ์ „์— ์‚ฌ์šฉํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

โ€‹

๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ด๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

โ€‹

ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor at new Dog === (์•„๋ž˜ ์ฝ”๋“œ๋Œ€๋กœ ์ฝ”๋”ฉ์„ ํ•œ๋‹ค๋ฉด, ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š” ์˜ค๋ฅ˜์ด๋‹ค)

class Dog extends Animal {
    constructor(name, age, gender) {
        this.gender = gender;
        super(name, age);
    }
}
ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
    at new Dog (/Users/yoonzero/Desktop/Sparta/Week_05/20.js:14:9)
    at Object.<anonymous> (/Users/yoonzero/Desktop/Sparta/Week_05/20.js:26:17)

ํ•ด์„ : 'this' ๋กœ ์ง€์ • ๋˜๋Š”, new Dog์— ํŒŒ์ƒ๋œ ์ƒ์„ฑ์ž๋กœ ๋ฐ˜ํ™˜ ๋˜๊ธฐ ์ „์—, ํŒŒ์ƒ๋œ ํด๋ž˜์Šค(= Dog) ์•ˆ์—์„œ super๋ฅผ ์™ธ์ณ์•ผ ํ•œ๋‹ค.

โ€‹

์œ„ ์ฝ”๋“œ๋Š” this ๋กœ gender ๋ฅผ ์ง€์ •ํ•œ ํ›„์— super ๋ฅผ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—,

์—„๋งˆํ•œํ…Œ ๋ง์„ ์•ˆํ•˜๊ณ  ๋‚ด ๋ง˜๋Œ€๋กœ ์ง€์ •ํ•ด ์“ด๊ฒƒ๊ณผ ๊ฐ™๋‹ค. === ์„ ์กฐ์น˜ ํ›„๋ณด๊ณ .


์ด์ œ super() ๋ฅผ ์‚ฌ์šฉํ•ด ๋‚ด๊ฐ€ ์›ํ•œ Dog์ด ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

const cuteDog = new Dog('๋˜˜์ด', 3, 'female');
const prettyPuppy = new Dog('์˜ˆ์‚', 2, 'male');
console.log(cuteDog);
console.log(prettyPuppy);

์œ„์™€ ๊ฐ™์ด ํ™•์ธํ•ด๋ณธ๋‹ค,

๋ถ€๋ชจํด๋ž˜์Šค์—๋Š” ์—†๋˜ gender ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์ž˜ ๋งŒ๋“ค์–ด์ง„๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


์˜ค๋Š˜์€ class ์˜ ์ƒ์† ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

์ƒ์†์„ ์ž˜ ์ด์šฉํ•œ๋‹ค๋ฉด , ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์›ํ•˜๋Š” ๊ฐ์ฒด๋“ค์˜ ์˜ต์…˜๋“ฑ์„ ์ˆ˜์ •ํ•˜๋ฉด์„œ ๋ฝ‘์•„๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ƒ์œ„ <-> ํ•˜์œ„ ๊ฐœ๋…์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ƒ์† ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์•ผ ๊ฒ ๋‹ค.


๋ฌธ : ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor at new Dog

์‹œ : super() ์˜ ์œ„์น˜๋ฅผ constructor ํ•จ์ˆ˜์˜ ๋ฐ–์œผ๋กœ๋„ ์ด๋™์‹œ์ผœ๋ณด๊ณ , this ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์ „์— super๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

ํ•ด : super() ๋Š” constructor ํ•จ์ˆ˜์˜ {}์•ˆ์— ์œ„์น˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์„ property ๋ฅผ ๋งํ•ด์ฃผ๊ณ , this ๋กœ ์ถ”๊ฐ€ํ•œ property ๋ฅผ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์•Œ : class ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ธ ์ƒ์†์„ ์•Œ๊ฒŒ๋˜๋ฉด์„œ, ๋‚ด๊ฐ€ ์˜ค๋Š˜๊นŒ์ง€ ์•Œ์•˜๋˜ ๊ฐœ๋…๋ณด๋‹ค ํ™•์žฅ๋œ class ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. super() ์˜ ์‚ฌ์šฉ๋ฒ•, ์ƒˆ๋กœ์šด Error ๋ฉ”์‹œ์ง€.

โ€‹

โ€‹

#javascript #๋ฌธ๋ฒ• #class #super #์ƒ์† #ํ•˜์œ„ํด๋ž˜์Šค #์ƒ์œ„ํด๋ž˜์Šค #๋ถ€๋ชจํด๋ž˜์Šค #๋ฌธ์‹œํ•ด์•Œ

#ReferenceError #์˜ค๋ฅ˜ #์˜ค๋ฅ˜ํ•ด๊ฒฐ #this #์ˆœ์„œ_์ฃผ์˜