super

이전에 작성한 PersonPlus class에만 third라는 새로운 인자를 추가하고 싶다고 가정하자

아래와 같이 코드처럼 PersonPlus에 Person의 기능을 모두 가져와 수정하면 상속의 의의가 없어지게 되는 문제가 있다.


/** PersonPlus */
class PersonPlus extends Person{
  constructor(name, first, second, third){
  	this.name = name;
    this.first = first;
    this.second = second;
    this.third = third;
  }
  sum(){
  	return this.first + this.second + this.third;
  }
  avg(){
  	return (this.first + this.second + this.third) / 3;
  }
}

이럴때 사용되는 키워드가 바로 Super다.

super의 용법은 두가지가 있다.

  1. 부모 클래스의 생성자 호출
    super()
  1. 부모 클래스
    super.sum()

만약 PersonPlus의 constructor가 실행되기 전에 부모 클래스의 기능이 먼저 실행되도록 하는게 어떨까?

class Person{
	constructor(name, first, second){
		this.name = name;
		this.first = first;
		this.second = second;
	}
  	sum(){
  		return this.first + this.second;
  	}
}
/** PersonPlus */
class PersonPlus extends Person{
	constructor(name, first, second, third){
    	super(name,first,second);
      	this.third = third;
    }
  	sum(){
    	return super.sum() + this.third;
    }
  	avg(){
    	return (this.first + this.second + this.third) / 3;
    }
}

var kim = new PersonPlus('kim', 10, 20, 30);
console.log("kim.sum() : ", kim.sum());
console.log("kim.avg() : ", kim.avg());

결과
kim.sum() : 60
kim.avg() : 20

정리 요약

super키워드는 부모 오브젝트의 함수를 호출할 때 사용된다.

super() 부모 클래스 생성자 호출

super.method() 부모 클래스 메소드 실행

super를 사용 하면 자식클래스는 부모의 기능을 사용할 수 있고,
자식만의 추가적인 기능을 만들 수 있어 불필요한 코드가 늘어나지 않고 상속도 의미가 있어진다.

profile
해야되요

0개의 댓글