16. class (상속)

양희쀀·2022λ…„ 4μ›” 11일
0

JavaScript Info

λͺ©λ‘ 보기
16/19
post-thumbnail

πŸ“Œ 16-1 상속

상속을 ν†΅ν•΄μ„œ μžμ‹ μ˜ νŠΉμ„±μ„ μœ μ§€ν•˜κ³  λ‹€λ₯Έ 클래슀의 νŠΉμ„±μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

  • ν΄λž˜μŠ€μ— λ‹€λ₯Έ 클래슀λ₯Ό ν¬ν•¨μ‹œν‚€λŠ” ν˜•νƒœμ΄λ‹€.
  • 상속받은 클래슀의 λ©”μ†Œλ“œμ™€ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.
  • 상속 ν•΄μ£ΌλŠ” 클래슀λ₯Ό λΆ€λͺ¨ 클래슀, 수퍼 클래슀라고 ν•œλ‹€.
  • μƒμ†λ°›λŠ” ν΄λž˜μŠ€λŠ” μžμ‹ 클래슀, μ„œλΈŒ 클래슀라고 ν•œλ‹€.

πŸ“Œ 16-2 extends ν‚€μ›Œλ“œ

상속을 κ΅¬ν˜„ν•  수 있게 ν•˜λŠ” 문법이닀.

  • extends 문법을 μ‚¬μš©ν•˜μ—¬ 클래슀λ₯Ό ν™•μž₯μ‹œν‚¨λ‹€.
  • extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ₯Ό μ§κ΄€μ μœΌλ‘œ 해석할 수 μžˆλ‹€.

🧩 class μžμ‹ 클래슀 extends λΆ€λͺ¨ 클래슀

// 수퍼 클래슀λ₯Ό μƒμ„±ν•œλ‹€.
class SuperClass {
    log1() {
        console.log("SuperClass");
    }
}
// extendsλ₯Ό μ΄μš©ν•˜μ—¬ 상속을 κ΅¬ν˜„ν•œλ‹€.
class SubClass extends SuperClass {
    log2() {
        console.log("SubClass");
    }
}
// μΈμŠ€ν„΄μŠ€ 생성
const subClass = new SubClass();
// κ²°κ³Ό : SuperClass
subClass.log1();
// κ²°κ³Ό : SubClass
subClass.log2();

πŸ”₯ 수퍼 클래슀의 λ©”μ†Œλ“œλ₯Ό μ„œλΈŒ ν΄λž˜μŠ€κ°€ μ‚¬μš©ν•  수 μžˆλ‹€.

🧩 동적 상속

let isChecked = true;
class SuperClass1 {
    log1() {
        console.log("SuperClass1");
    }
}
class SuperClass2 {
    log1() {
        console.log("SuperClass2");
    }
}
// 3ν•­ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ„œ 상속받을 클래슀λ₯Ό κ²°μ •ν•œλ‹€.
class SubClass extends (isChecked ? SuperClass1 : SuperClass2) {
    log2() {
        console.log("SubClass");
    }
}
const subClass = new SubClass();
// κ²°κ³Ό : SuperClass1
subClass.log1();
let isChecked = true;

class SuperClass1 {
    log1() {
        console.log("SuperClass1");
    }
}
class SuperClass2 {
    log1() {
        console.log("SuperClass2");
    }
}
// classκ°€ 상속받기 μ΄μ „μ˜ isChecked μƒνƒœλ‘œ 상속받을 ν΄λž˜μŠ€κ°€ κ²°μ •λœλ‹€.
isChecked = false;
class SubClass extends (isChecked ? SuperClass1 : SuperClass2) {
    log2() {
        console.log("SubClass");
    }
}
// κ²°κ³Ό : SuperClass2
const subClass = new SubClass();
subClass.log1();

πŸ”₯ 상속받기 μ „μ˜ μƒνƒœλ₯Ό ν™•μΈν•˜μ—¬ 클래슀λ₯Ό λ™μ μœΌλ‘œ 상속을 μ§€μ •ν•œλ‹€.

πŸ“Œ 16-3 super ν‚€μ›Œλ“œ

상속을 받은 수퍼 클래슀의 ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 클래슀의 λ©”μ†Œλ“œλ₯Ό μ„œλΈŒ 클래슀의 μ•ˆμ—μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” 문법이닀.

  • ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€.
  • μ°Έμ‘°κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

🧩 super ν•¨μˆ˜ 호좜

// 학생 클래슀λ₯Ό 생성
class Student {
    constructor(name, age, classCode) {
        this.name = name;
        this.age = age;
        this.classCode = classCode;
        console.log(this.name, this.age, this.classCode);
    }
}
// ꡐ수 클래슀λ₯Ό 생성
class Professor {
    constructor(name, age, classScale) {
        this.name = name;
        this.age = age;
        this.classScale = classScale;
        console.log(this.name, this.age, this.classScale);
    }
}
// κ²°κ³Ό : Kim 23 A12
const student = new Student("Kim", 23, 'A12');
// κ²°κ³Ό : Lee 41 30
const professor = new Professor("Lee", 41, 30);

클래슀λ₯Ό 2개 μƒμ„±ν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€λ©΄ μ€‘λ³΅λœ 정보가 2번 μ„ μ–Έλœλ‹€.

// 각각의 κ³΅μœ ν•˜λŠ” νŠΉμ„±μΈ nameκ³Ό ageλ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ 학ꡐ 클래슀λ₯Ό 생성
class School {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}
// 학ꡐ 클래슀λ₯Ό 상속 λ°›μ•„μ„œ μ‚¬μš©ν•œλ‹€.
class Student extends School {
    constructor(name, age, classCode) {
        // superλ₯Ό ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©ν•œλ‹€.
        super(name, age);
        this.classCode = classCode;
        console.log(this.name, this.age, this.classCode);
    }
}
// ꡐ수 클래슀λ₯Ό 상속 λ°›μ•„μ„œ μ‚¬μš©ν•œλ‹€.
class Professor extends School {
    constructor(name, age, classScale) {
        // superλ₯Ό ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©ν•œλ‹€.
        super(name, age);
        this.classScale = classScale;
        console.log(this.name, this.age, this.classScale);
    }
}
// κ²°κ³Ό : Kim 23 A12
const student = new Student("Kim", 23, 'A12');
// κ²°κ³Ό : Lee 41 30
const professor = new Professor("Lee", 41, 30);
  • superλ₯Ό ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•˜μ—¬ 상속을 μ΄μš©ν•˜λ©΄ 수퍼 클래슀인 학ꡐ ν΄λž˜μŠ€μ—λŠ” 곡톡적인 νŠΉμ„±μ„ μ§€μ •ν•˜κ³  μ„œλΈŒ 클래슀인 학생, ꡐ수 ν΄λž˜μŠ€μ—λŠ” 각각의 κ³ μœ ν•œ νŠΉμ„±μ„ μ§€μ •ν•˜μ—¬ λ”μš±λ” 효율적이게 관리할 수 있게 λœλ‹€.
  • super ν•¨μˆ˜ ν˜ΈμΆœμ„ ν•˜λ©΄ 수퍼 클래슀의 constructorλ₯Ό ν˜ΈμΆœν•˜κ²Œ λœλ‹€.

🧩 μ˜€λ²„λΌμ΄λ”©
상속을 받은 μ„œλΈŒ 클래슀의 λ©”μ†Œλ“œλ‚˜ ν”„λ‘œνΌν‹°κ°€ λΆ€λͺ¨ 클래슀의 이름과 겹치면 μ„œλΈŒ 클래슀의 λ©”μ†Œλ“œμ™€ ν”„λ‘œνΌν‹°κ°€ ν˜ΈμΆœλœλ‹€.

class School {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    info() {
        console.log(`이름은 ${this.name} μž…λ‹ˆλ‹€.`);
        console.log(`λ‚˜μ΄λŠ” ${this.age} μž…λ‹ˆλ‹€.`);
    }
}

class Student extends School {
    constructor(name, age, classCode) {
        super(name, age);
        this.classCode = classCode;
    }
    info() {
        console.log(`κ°•μ˜μ‹€μ˜ κ³ μœ μ½”λ“œλŠ” ${this.classCode} μž…λ‹ˆλ‹€.`);
    }
}

class Professor extends School {
    constructor(name, age, classScale) {
        super(name, age);
        this.classScale = classScale;
    }
    info() {
        console.log(`κ°•μ˜μ‹€μ˜ 총 학생 μˆ˜λŠ” ${this.classScale} μž…λ‹ˆλ‹€.`);
    }
}

const student = new Student("Kim", 23, 'A12');
const professor = new Professor("Lee", 41, 30);
// κ²°κ³Ό : κ°•μ˜μ‹€μ˜ κ³ μœ μ½”λ“œλŠ” A12 μž…λ‹ˆλ‹€.
student.info();
// κ²°κ³Ό : κ°•μ˜μ‹€μ˜ 총 학생 μˆ˜λŠ” 30 μž…λ‹ˆλ‹€.
professor.info();
  • 이름이 κ°™μœΌλ©΄ ν”„λ‘œν† νƒ€μž… 체인으둜 κ°€μž₯ λ¨Όμ € λ§Œλ‚˜λŠ” 같은 μ΄λ¦„μ˜ μš”μ†Œλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μΌμ–΄λ‚˜λŠ” λ¬Έμ œμ΄λ‹€.
  • super 참쑰둜 해결이 κ°€λŠ₯ν•˜λ‹€.
class School {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    info() {
        console.log(`이름은 ${this.name} μž…λ‹ˆλ‹€.`);
        console.log(`λ‚˜μ΄λŠ” ${this.age} μž…λ‹ˆλ‹€.`);
    }
}

class Student extends School {
    constructor(name, age, classCode) {
        super(name, age);
        this.classCode = classCode;
    }
    info() {
        // superλ₯Ό μ°Έμ‘°ν•΄μ„œ 학ꡐ 클래슀의 info λ©”μ†Œλ“œλ₯Ό 가져와 μ‚¬μš©ν•œλ‹€.
        super.info();
        console.log(`κ°•μ˜μ‹€μ˜ κ³ μœ μ½”λ“œλŠ” ${this.classCode} μž…λ‹ˆλ‹€.`);
    }
}

class Professor extends School {
    constructor(name, age, classScale) {
        super(name, age);
        this.classScale = classScale;
    }
    info() {
        // superλ₯Ό μ°Έμ‘°ν•΄μ„œ 학ꡐ 클래슀의 info λ©”μ†Œλ“œλ₯Ό 가져와 μ‚¬μš©ν•œλ‹€.
        super.info();
        console.log(`κ°•μ˜μ‹€μ˜ 총 학생 μˆ˜λŠ” ${this.classScale} μž…λ‹ˆλ‹€.`);
    }
}

const student = new Student("Kim", 23, 'A12');
const professor = new Professor("Lee", 41, 30);
/*
κ²°κ³Ό : 
이름은 Kim μž…λ‹ˆλ‹€.
λ‚˜μ΄λŠ” 23 μž…λ‹ˆλ‹€.
κ°•μ˜μ‹€μ˜ κ³ μœ μ½”λ“œλŠ” A12 μž…λ‹ˆλ‹€.
*/
student.info();
/*
이름은 Lee μž…λ‹ˆλ‹€.
λ‚˜μ΄λŠ” 41 μž…λ‹ˆλ‹€.
κ°•μ˜μ‹€μ˜ 총 학생 μˆ˜λŠ” 30 μž…λ‹ˆλ‹€.
*/
professor.info();

super μ°Έμ‘°λ₯Ό μ‚¬μš©ν•΄μ„œ μ˜€λ²„λΌμ΄λ”© 문제λ₯Ό ν•΄κ²°ν•˜κ³  곡톡적인 λ©”μ†Œλ“œμ˜ λ¬Έμ œλ„ ν•΄κ²°ν•˜λ©° μΆ”κ°€ν•΄μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜κ²Œ λœλ‹€.

πŸ”₯ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ˜€λ²„λΌμ΄λ”©μ€ μ§€μ›ν•˜μ§€λ§Œ μ˜€λ²„λ‘œλ“œλŠ” μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•΄μ„œ κ°€λŠ₯ν•˜λ‹€.

πŸ“Œ 16-4 빌트인 였브젝트 상속

빌트인 였브젝트 상속 빌트인 였브젝트λ₯Ό 상속 λ°›μœΌλ©΄ 빌트인 λ©”μ†Œλ“œμ™€ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

  • μ‚¬μš©λͺ©μ μ€ ν”„λ‘œν† νƒ€μž…μœΌλ‘œ 직접 빌트인 μ˜€λΈŒμ νŠΈμ— λ©”μ†Œλ“œλ₯Ό μ—°κ²°ν•˜λ©΄ 라이브러리 λ“±λ“± ν˜Έν™˜λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.
  • 상속 λ°›λŠ” 클래슀λ₯Ό λ§Œλ“€μ–΄μ„œ λ”°λ‘œ 관리할 수 μžˆλ‹€.
// (1)
class NewArray extends Array {
    // (2)
    divide(n) {
        const result = [];
        for(let i = 0, j = this.length; i < j; i += n) {
            const item = this.slice(i, i + n);
            result.push(item);
        }
        return result;
    }
}
// (3)
const newArray = new NewArray(1,2,3,4,5,6,7,8);
// (4)
const divideArr = newArray.divide(3);
// (5)
console.log(divideArr);

πŸ“‹ μ½”λ“œ λ™μž‘ κ³Όμ •
β‘  빌트인 였브젝트인 Arrayλ₯Ό 상속 λ°›λŠ”λ‹€.
β‘‘ 1차원 배열을 μš”μ†Œλ₯Ό n만큼의 μš”μ†Œλ‘œ λ‚˜λˆ„κ³  2차원 λ°°μ—΄λ‘œ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ μ„ μ–Έ
β‘’ μΈμŠ€ν„΄μŠ€ 생성
β‘£ divide λ©”μ†Œλ“œμ˜ κ²°κ³Όλ₯Ό λ³€μˆ˜μ— μ €μž₯
β‘€ divideArr 좜λ ₯

profile
JS 코린이

0개의 λŒ“κΈ€