본문 바로가기
JavaScript/JavaScript

Javascript) class 기본, class 상속

by 박채니 2022. 5. 27.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


Class

- 생성자 함수와 상속 관계를 문법적으로 쉽게 표현

- 생성자 함수의 Syntactic Sugar(문법적 설탕)

 

- class는 동일한 이름의 생성자 함수를 선언

- new 연산자를 통해 생성자 함수를 호출하면 constructor가 호출

- 클래스 내에 선언된 메소드(메소드 단축문법)는 prototype에 작성

- 클래스 내에 선언한 속성은 현재 객체의 속성이 됨

- static 키워드를 사용하면 생성자 함수의 속성으로 등록할 수 있음

 

 

class 기본

 

HTML 코드

<button onclick="test4();">class 기본</button>

 

Javascript 코드

const test4 = () => {
    const honggd = new Person('홍길동', '01012341234');
    console.log(honggd);

    console.log(typeof Person, Person);
};

class Person {
    constructor(name, phone) { // new생성자와 함께 생성
        this.name = name;
        this.phone = phone;
    }
};

Person의 타입은 function인 것을 확인할 수 있습니다.

또한 new 생성자와 함께 constructor가 호출되어 '홍길동', '01012341234'가 출력되는 것을 확인할 수 있습니다.

 

 

현재 객체 속성 지정

const test4 = () => {
    const honggd = new Person('홍길동', '01012341234');
    console.log(honggd);

    console.log(typeof Person, Person);
};

class Person {
    constructor(name, phone) { // new생성자와 함께 생성
        this.name = name;
        this.phone = phone;
    }
    // 현재 객체 속성 지정
    x = 10;
};

 

생성자 함수의 속성 지정

const test4 = () => {
    const honggd = new Person('홍길동', '01012341234');
    console.log(honggd);

    console.log(typeof Person, Person);

    // static 속성 호출
    console.log(Person.y);
    Person.z();
};

class Person {
    constructor(name, phone) { // new생성자와 함께 생성
        this.name = name;
        this.phone = phone;
    }
    // 현재 객체 속성 지정
    x = 10;

    // 생성자 함수의 속성 지정
    static y = 20;
    static z() {
        console.log('zzz');
    };
};

 

prototype 속성 - 메소드 단축 문법

const test4 = () => {
    const honggd = new Person('홍길동', '01012341234');
    console.log(honggd);

    console.log(typeof Person, Person);

    // static 속성 호출
    console.log(Person.y);
    Person.z();

    // sayHi()
    honggd.sayHi();
};

class Person {
    constructor(name, phone) { // new생성자와 함께 생성
        this.name = name;
        this.phone = phone;
    }
    // 현재 객체 속성 지정
    x = 10;

    // 생성자 함수의 속성 지정
    static y = 20;
    static z() {
        console.log('zzz');
    };

    // prototype 속성 - 메소드 단축 문법
    sayHi() {
        console.log(`안녕하세요, 저는 ${this.name}입니다.`);
    }
};


Class 상속

 

HTML 코드

<button onclick="test5();">class 상속</button>

 

Javascript 코드

const test5 = () => {
    const sinsa = new Dev('신사임당', '01098765432', 'Javascript');
    console.log(sinsa);
    sinsa.sayHi();
};

class Person {
    constructor(name, phone) { // new생성자와 함께 생성
        this.name = name;
        this.phone = phone;
    }
    // 현재 객체 속성 지정
    x = 10;

    // 생성자 함수의 속성 지정
    static y = 20;
    static z() {
        console.log('zzz');
    };

    // prototype 속성 - 메소드 단축 문법
    sayHi() {
        console.log(`안녕하세요, 저는 ${this.name}입니다.`);
    }
};

class Dev extends Person {
    constructor(name, phone, lang) {
        super(name, phone);
        this.lang = lang;
    }

    // Dev.prototype
    sayHi() {
        super.sayHi(); // 프로토타입체인 상의 부모 메소드 호출
        console.log(`저는 ${this.lang} 개발자 입니다.`);

    }
};

extends 키워드를 이용하여 상속 구조를 나타냈으며, super 키워드를 이용해 부모 생성자, 부모 메소드를 호출해주었습니다.

 


class Book {
    constructor(title, price, discountRate=0.05) {
        this.title;
        this.price;
        this.discountRate;
    }
    getSalePrice() {
        return this.price - (this.price*this.discountRate);
    };
    toString() {
        return `제목 : ${this.title}, 판매가 : ${this.getSalePrice()}원 (정가 : ${this.price})`;
    };
}

class Novel extends Book {
    constructor(title, price, discountRate=0.05, type) {
        super(title, price, discountRate);
        this.type = type;
    }
}

class Comic extends Book {
    constructor(title, price, discountRate=0.05, end) {
        super(title, price, discountRate);
        this.end = end;
    }
    toString() {
        return `[${this.end ? '완결' : '연재중'}] ${super.toString()}`;
    }
}