클래스의 상속

보통 자식 클래스를 subclass, 부모 클래스를 superclass라 한다.

class Animal {
    move(distanceInMeters: number = 0) {
        console.log(`Animal moved ${distanceInMeters}`)
    }
}

class Dog extends Animal {  // 부모 Animal을 상속받은 자식 Dog
    bark() {
        console.log('Bark!')
    }
}

const dog = new Dog()
dog.bark()
dog.move(10) // Can use superclass's methods or properties
dog.bark()

상속 - super와 생성자

자식 클래스에서 부모 클래스에 접근하기 위해서는 super를 사용한다.

  1. super() : 부모 클래스의 생성자를 호출한다.
  2. super. : 마치 this 처럼 부모 클래스 자체를 의미한다. 이를 통해서 부모 클래스의 속성이나 메서드에 접근할 수 있다.
  3. 자식 클래스는 생성자 내에서 this를 사용하기 전에 무조건 super()를 호출해야 한다.
class Animal {  // 부모
    name: string;
    constructor(theName: string) {this.name = theName}
    move(distanceInMeters: number = 0) {
        console.log(`${this.name} moved ${distanceInMeters}`)
    }
}

class Snake extends Animal {  // 자식1
    constructor(name: string) { **super(name)** }  // super is necessary
    move(distanceInMeters: number = 5) {  // overloading
        console.log("Slithering....")
        **super.move(distanceInMeters)**
    }
}

class Horse extends Animal {  // 자식2
    constructor(name: string) { **super(name)** }  // super is necessary
    move(distanceInMeters: number = 45) {  // overloading
        console.log("Galloping...")
        **super.move(distanceInMeters)**
    }
}

const snake = new Snake("snakey")  // "Slithering...."
snake.move(1)  // "snakey moved 1"

super는 필수이다

부모에 생성자가 없는 상태에서 자식이 자신의 생성자를 사용하려 하면 꼭 super를 사용해야 한다고 한다.

class Animal {  // 생성자 없는 부모
    name: string='snake';
    move(distanceInMeters: number = 0) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}

class Snake extends Animal {
    constructor(name: string) { this.name = name }  // 에러!!!!!!!!!!!!!!!!!!
    move(distanceInMeters = 5) {
        console.log("Slithering...");
        super.move(distanceInMeters);
    }
}

let sam = new Snake();

왜 부모에게 생성자가 없는데 꼭 자식에서 super를 사용해야 하는가?

그래야만 하는 이유는 생성자를 명시적으로 설정해주지 않아도 자동으로 생성자가 생기기 때문이다.

console.log(Animal)

// 결과
class Animal {
    constructor() {  // 자동으로 생긴다! 클래스의 속성들이 자동으로 들어가게 된다.
        this.name = 'asd';
    }
    move(distanceInMeters = 0) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}

Public, private, protected, readonly