프로그래밍/JavaScript

[JavaScript] 상속과 오버라이드(오버라이딩)

승민아 2023. 1. 9. 22:08

상속

상속의 필요성을 이해해 보자.

사각형 클래스와 정사각형 클래스를 먼저 만들어 본다.

 

사각형 클래스

class Rectangle {
    constructor(width, height) {
        this.width = width
        this.height = height
    }
    
    // 둘레 계산
    getPerimeter() {
        return 2 * (this.width + this.height)
    }
    
    // 넓이 계산
    getArea() {
        return width * height
    }
}

 

정사각형 클래스

class Square {
    constructor(length) {
        this.length = length
    }
    
    // 둘레 계산
    getPerimeter() {
        return 4 * this.length
    }
    
    // 넓이 계산
    getArea() {
        return this.length * this.length
    }
}

 

보면 정사각형이나 사각형이나 둘레나 넓이를 구하는 방법이 비슷하다.

정사각형의 한쪽 길이를 가지고 사각형 클래스에 width와 height를 쓰면 동일하지 않는가?

그래서 중복을 작성하지 않고 공통된 기능을 상속시킬 수 있는 방법이 있다.

 

정사각형 클래스에 사각형 클래스를 상속받아 구현하여

동일한 기능을 갖게 만들 수 있다.

 

상속 형태

class 클래스이름 extends 부모클래스이름 {
   ...
}

 

 

사각형을 상속받은 정사각형 클래스

class Square extends Rectangle {
    constructor(length) {
        super(length, length)
    }
}

const square = new Square(2)

super()는 부모의 생성자를 호출하는 메소드이다.

중복되는 함수와 속성들을 상속을 통해 최소화할 수 있다.

 

오버라이딩(오버라이드)

부모에게 상속받은 함수를 다시 자식이 선언하여 덮어쓰는 것을 오버라이딩이라고 한다.

오버로딩과 헷갈릴 수 있는데

오버로딩은 메소드 이름은 같으나 매개변수의 개수나 타입이 다르게 하여 선언한 것이다.

 

오버라이딩

class Parent {
    call() {
        console.log('Parent Call')
    }
}

class Child {
    call() {
        console.log('Child Call')
    }
}

 

아래의 실행 결과는 어떻게 될까?

new Child().call()

 

메소드가 오버라이딩이 되어 Child의 call이 실행된다.

 

부모 메소드 호출 방법

class Child {
    call() {
        super.call()
    }
}

super.메소드() 형태로 부모의 메소드를 호출한다.

 

toString 메소드

어떤 객체를 문자열로 반환하는 메소드이다. 이 메소드는 모든 객체는 가지는 메소드이다.

모든 객체는 Object라는 가장 최상위 클래스를 갖는데 이곳에 toString 메소드가 있다.

 

예제 코드

class People {
    constructor(){
        this.name='홍길동'
        this.age=20
    }
    
    toString() {
        return `이름:${this.name} 나이:${this.age}`
    }
}

console.log(new People())

객체를 그냥 출력하면 자동으로 toString 메소드의 결과를 출력한다.

이것은 우리가 toString 메소드를 오버라이딩 했기 때문이다.