JavaScript 객체 지향 프로그래밍

super

수업소개

서브(자식) 클래스에서 상위 클래스를 호출할 때 사용하는 super 키워드를 소개합니다. 

 

 

 

강의

 

 

 

코드

class.js (변경사항)

class Person{
    constructor(name, first, second){
        this.name = name;
        this.first = first;
        this.second = second;
    }
    sum(){
        return this.first+this.second;
    }
}
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());

 

댓글

댓글 본문
  1. 차돌배기
    231112
    *super의 두가지 용법
    1. super(): 부모 클래스의 생성자를 호출한다.
    2. super."메서드명"(): 부모 클래스의 프로토타입 메서드를 호출한다.

    *super 키워드의 장점
    1. 부모 클래스에서 선언된 생성자, 변수(필드), 메서드를 재사용할 수 있다.
    2. 자식 클래스에서 생성자와 메서드를 중복 선언할 필요가 없어진다.
  2. 파시
    230619
  3. Kyu Youn Lee
    감사합니다.
  4. LLLEE
    super의 두가지 용법
    1. super(): 부모-class의 생성자(constructor)를 참조한다.
    2. super.method() : 부모-class의 prototype-method를 참조한다.

    super의 기술적 의미
    -> 상속된(자식) class에 요소 추가 시 새로 추가되는 parameter를 정의하려면
    기존(부모)-class constructor를 다시 정의해 주어야 한다.
    이 과정에서 생기는 중복되는 코드가 발생해, error발생 확률 증가, 메모리 낭비 등 매우 비효율적인 낭비가 생긴다.
    이러한 부분을 super로 해결할 수 있다.
  5. 분위기
    부모 클래스에게 상속받아 자식 클래스를 만들었는데, 자식 클래스에 속성을 추가하려고 한다. 이때 필요한게 super 라는 개념이다.

    super()는 자식 클래스의 constructor 내부에 작성하여 부모 클래스의 속성 값을 불러와 초기값을 셋팅한다.
    super.함수명은 자식 클래스에서 새로 정의한 메서드의 리턴 값에 쓴다. 이를 통해 부모 클래스에서 계산된 값이 넘어 오게 된다.

    이렇게 코드를 작성하면 일괄 수정이 가능하고 중복을 방지할 수 있다. 결국 생산성이 증대된다!
  6. 개발맨
    완료
  7. mini
    20211203 감사합니다!
  8. 주니준
    super의 사용이유?
    상속을 받게 됐을 때 자식 클래스에서 새로운 요소를 추가할때 super를 사용하면 코드의 재사용을 줄일 수 있다.
    super의 2가지 용법
    1. super() : 부모클래스의 생성자가 호출이 된다.
    2. super. : 부모클래스 자체를 뜻함.
  9. labis98
    20210904 좋은 강의 감사합니다.
  10. 홍현기
    super는 부모 클래스의 내용이 자식 클래스에도 비효율적으로 중복 존재하고 있을 때 그 내용을 치우고 대신 들어가는 키워드이다.

    super()로 부모 클래스의 생성자(constructor)에 접근한다. 객체 공장의 객체 찍어내는 기계를 일일이 똑같이 하나 더 제조할 필요 없이 복제 빔을 쏴서 하나 더 만든다고 생각하면 된다. 더 필요한 기능이 있으면 복제본에 추가하면 된다.

    super.method로 부모 클래스의 메서드를 가져다 쓸 수 있다. 복제 빔을 쏴서 만든 복제본에 원본의 부품 일부만을 꺼내다가 장착하고 싶을 때 쓴다.

    super가 없다면 객체 찍어내는 공장의 생산 효율이 굉장히 떨어질 것이다. super는 객체 공장의 복제 빔이다. 복제 빔 없는 객체 공장은 상상도 할 수 없다.
  11. Kenna
    1. super() 부모 클래스의 생성자
    2. super.method 부모 클래스의 메소드를 가져다 씀
  12. hyun e
    <Super>
    괄호가 있는 super -> 부모의 생성자에 접근한다.
    괄호가 없는 super -> 부모의 메소드에 접근한다. ex) 함수 등

    만약, super가 없다면?
    -> 부모의 인자를 상속받은 자식 객체에서 무언가 새로운 함수 등을 추가하고 싶을 때, 일일이 부모 인자의 메소드 값을 동일하게 입력한 뒤 새로운 값을 입력해주어야 한다. 이것은 매우 지저분한 코드를 만들게 함은 물론, 코드의 반복이 자주 일어나므로 좋지 않은 코드라고 할 수 있다. 따라서 super를 이용해주면 아주 손쉽게 부모의 메소드 혹은 객체를 이어받되, 새로운 값을 추가해줄 수 있는 것이다.
  13. 최동희
    super.x 용법을 통해 부모 class의 property를 호출할 수 있고, super() 용법을 통해 부모 class의 instance 객체를 생성할 수 있는 것 같다.
  14. 이동준
    super는 하위 클래스에서 상위클래스를 수정할때 주로 사용되며
    2가지 용법으로 나뉩니다
    super(), super.xxx
    super() 는 상위클래스의 생성자(constructor)를 호출하고
    super.xxx(여기서xxx는 상위클래스의 매소드입니다) 는
    상위클래스의 매소드를 호출하고 매소드에 해당하는 return값을 반환해 줍니다.

    만약 super가 없다면 상속이 사용되는경우가 매우적을것이며
    한번 수정할때마다 중복되는 코드가 생길 것 입니다.
    이렇게 된다면 상속을 써서 중복코드를 없앤것이 의미가 없어지고
    코드 수정이 매우 번거롭기도 합니다
  15. 지성
    이쯤되면 "뭔가 불편한게 있습니다" << 이 단어가 생활코딩 유행어 될거 같네요 :)
  16. 광릉매니아
    슈퍼맨~
    대화보기
    • 마그마
      1. super()와 super. 의 차이
      - super()시 부모 클래스의 생성자 호출. 필요한 인자를 넘겨줘야함
      - super. 사용시 부모 클래스의 속성값에 접근하는 용도로 사용.

      2. super가 없다면?
      - 부모 클래스에서 기능을 추가하고 싶을 때 필요한 코드를 자식 클래스에서 중복 작성해야한다.
      - 자식 클래스에서 부모 클래스의 속성값에 접근하지 못한다.
    • jsm5272
      - super() 와 super. 의 용법은 각각 무엇인가?
      super()은 부모클래스의 constructor 즉, 생성자로서의 역할을 수행한다.
      super. 은 부모클래스 자체를 의미하며 super.<무엇>에서 <무엇>에는 부모클래스의
      키값이나 메서드가 올수 있다.

      - super가 없다면 어떤점이 불편한가? 있다면 어떤점이 편리한가?
      super가 없다면 class를 사용하는 의미가 없어지며, 부모클래스와 중복되는
      코드를 모두 다시 한번 작성해야하기 때문에 효율성이 떨어진다.
      그런데 이를 사용하게되면 부모가 가지고있는 기능들을 모두 가져다 쓸수 있어
      중복을 제거할 수 있고, 유지보수에 좋다.

      - 상속의 기능으로 인해 생기는 단점을 어떤게 보완하는가?
      상속받은 기능은 변경할수 없었는데 super를 통해 중복되는 부분은 끌어다 쓰고, 추가적인 부분은 추가하여 보완할 수 있다.
    • king
      -용법 super() 와 super. 의 각각 무엇인가?

      먼저 constructor(생성자)로 자식 클래스에서 사용할 값들을 정하고 난 뒤,
      부모로 부터 상속 받아올 값(부모클래스의 생성자를 호출)을 super()의 괄호 안에 넣을 때 사용하는 용법(그 뒤 자식에게 추가할 값을 추가하는 방식으로 활용한다.)
      super.은 부모를 뜻함. super.<어떤것> 은 부모가 가지고 있는 속성 중 <어떤 것>을 사용할 지 선택하기 위해 사용하는 용법

      -super가 없어서 어떤점이 불편한가? super가 있어서 어떤 편리함을 얻게 되는가?
      new객체 생성시 값을 추가하고 싶을 때(third), super가 없다면 부모의 모든 값을 추가해야하지만,
      super()를 이용해서, 부모가 가지고 있는 기능은 가져와서 실행하게 한다.

      -상속의 기능으로 인해 생기는 단점을 어떻게 보완하는가?
      관계의 복잡성은 생기지만 반복을 줄여, 코드의 재사용성을 높여 관계만 잘 파악한다면 유지보수가 용이하다.
    • Giri
      감사합니다.
    • plora
      상속에서 super란 부모 클래스 값을 불러오는 수단으로 가로를 사용하여 코드를 적용할때는 부모 클래스를 생성자를 통하여 셋팅한 값을 또한 가로가 없을때는 변수및 메소드를 불러와서 값을 리턴해줍니다.
      이러한 super를 사용하는 이유에는 상속에서 부모 값 변수, 메소드 정보값에서 추가로 변경될때에는 구조가 다르기때문에 직접 작성을 해줘야하는데 이러면 부모에 있던 코드에서 추가되기 때문에 중복되는 코드가 많아집니다.
      이럴때 super를 사용하여 부모의 값을 가져와 변수,메소드,구조를 가져와 중복구조를 없앨 수 있습니다.
    • 장건우
      가로가 있을때: 부모 클레스의 생성자를 호출
      가로가 없을때: 부모 클레스의 객체(변수,메써드) 호출
    • bread
      super는 자식클래스에서 사용하며 상위클래스를 불러올때(일을 시킬때) 사용한다.
      super에 ( )을 같이 써주면 그건 상위클래스에 생성자 함수를 실행시키는 것이고
      나머지 추가된 코드만 자식클래스에서 수행한다.

      super.함수() 를 적게되면 상위클래스에 있는 함수가 리턴되서 값이 오고 추가적인 값을 자식클래스에서
      입력하면 됨
      super가 없으면 기존에 중복을 삭제시킬 수 있었던 상속의 개념이 무의미해진다.
      super가 있기 때문에 상속받은 코드를 수정할 때 코드의 중복을 방지할 수 있다.
    • 변찬우
      질문1.
      1) super()는 부모 클래스의 생성자와 동일한 역할을 수행한다. 따라서 부모 클래스 생성자가 a,b라는 인자를 가지고 있다면 super(a,b)로 표현할 수 있다.
      2) super는 '부모 클래스 입장에서의 this'와 같다고 볼 수 있을 것 같다. 예컨데 this가 my라면, super는 his/her/their로 해석할 수 있지 않을까? 생각한다. 따라서 본 예제에서의 super.sum() 는 부모의sum()메소드, 다시말해 their sum() 정도로 해석할 수 있지 않을까 한다.

      질문2.
      부모의 속성을 물려 받긴 하겠는데 그대로 물려받아 사용하기는 애매하고, 그 속성의 일부를 수정해야 할 때 사용된다. 이런 경우 super를 사용하지 않으면, 부모의 속성과 10개 중 9개가 같고 1개만 다르더라도 10개 모두를 새로 생성해야 한다. 이를테면 아버지의 운전자 보험에 자식을 포함시키면 돈을 조금만 내면 되는데... 자식이 신규로 가입하면 많은 비용이 지출되는 것과 같다고 할까? ㅋㅋㅋ
      참고로 이 경우 extends를 할 수 없다. Must call super constructor in derived class 에러가 난다. extends하는 경우 부모의 생성자가 먼저 호출되기 때문인 것 같다. 다시말해 그냥 새로운 클래스를 선언하는 상황이 발생하는 것이다.
    • 어쩌다보이
      슈퍼ㅁ..
    • 0cool
      부모 클래스에 있는 기능을 기반으로 또 따른 기능을 추가하고자 할때, super 키워드를 적극 이용한다!
    • hyuna lee
      상속받은 자녀 class의 생성자에 property를 추가하고 싶을때 부모class에서 상속받은 부분을 super()로 써주고 추가하고 싶은 프로퍼티를 추가로 써주면 된다. 즉 super()는 부모class의 생성자의 프로퍼티를 말함. 또 부모class의 메소드를 super.메소드명()로 쓰고, 추가하고 싶은 메소드를 추가로 써주면 된다.
    • 폭스킴
      부모 클래스를 기반으로 새로운 기능을 추가 구현한 자식 클래스를 상속받아 만들었을 때,
      super()를 통해 부모 클래스의 constructor를 호출하여 부모 클래스 초기 셋팅값을 사용할 수 있고,
      super.[메소드 이름] 을 통해 부모의 메소드를 호출하여 자식 클래스의 메소드와 콜라보를 할 수 있다.
      결국 기본적인 기능이 구현된 부모 클래스를 확장하여 사용자에게 필요한 기능을 추가한 자식 클래스를 사용하는데,
      코드의 중복없이 재사용성이 좋은 코드를 만들 수 있어 사용자의 편의를 증대시키고 유지보수가 편한 강려크한 기능!
      금수저 기능;;
    graphittie 자세히 보기