언어 및 도구들 공부/Javascript

super()

Dr.Mlem 2024. 9. 3. 21:49

class Animal {

  constructor(name) {

    this.name = name;

  }

 

  speak() {

    console.log(`${this.name} makes a sound.`);

  }

}

 

class Dog extends Animal {

  constructor(name, breed) {

    super(name); // 부모 클래스(Animal)의 생성자 호출

    this.breed = breed; 

  }

 

  speak() {

    console.log(`${this.name} barks.`);

  }

}

 

const dog = new Dog('Buddy', 'Golden Retriever');

dog.speak(); // 출력: Buddy barks.

 

이 코드에서, super(name); 이 하는 작업은 뭐야?

답안 표시
 
 

이 코드에서 super(name);부모 클래스인 Animal의 생성자를 호출하여 name 속성을 초기화하는 역할을 합니다.

자세한 설명:

  1. 클래스 상속: class Dog extends AnimalDog 클래스가 Animal 클래스를 상속받는다는 것을 의미합니다. 이는 DogAnimal의 모든 속성과 메서드를 물려받는다는 뜻입니다.
  2. 생성자 상속: 자식 클래스(Dog)도 자신의 생성자(constructor)를 가질 수 있습니다. 하지만 자식 클래스의 생성자에서는 super()를 호출하여 부모 클래스(Animal)의 생성자를 반드시 실행해야 합니다.
  3. super(name)의 역할:
    • super(name)은 부모 클래스(Animal)의 생성자를 호출하고, name 값을 전달합니다.
    • 부모 클래스의 생성자는 전달받은 name 값을 사용하여 this.name = name;을 실행하여 자신의 name 속성을 초기화합니다.
    • 결과적으로, 자식 클래스(Dog)의 인스턴스는 부모 클래스(Animal)로부터 상속받은 name 속성을 갖게 됩니다.
  4. this.breed = breed: 자식 클래스(Dog)의 생성자는 super(name) 호출 후에 this.breed = breed;를 실행하여 자신의 breed 속성을 추가로 초기화합니다.

요약:

  • super(name);은 부모 클래스(Animal)의 생성자를 호출하여 name 속성을 초기화합니다.
  • 이를 통해 자식 클래스(Dog)의 인스턴스는 부모 클래스로부터 상속받은 name 속성을 갖게 되고, 추가로 자신의 breed 속성도 갖게 됩니다.
 
 
 
 
 
 

super(name);은 부모 클래스(Animal)의 생성자를 호출하여 name 속성을 초기화합니다.

여기서 초기화 한다는게 무슨 말이야?

 
답안 표시
 

초기화란 객체를 생성할 때 객체의 속성(property)에 처음으로 값을 할당하는 과정을 의미합니다.

super(name);의 초기화 과정:

  1. 객체 생성: new Dog('Buddy', 'Golden Retriever') 코드를 실행하면, 먼저 빈 Dog 객체가 생성됩니다. 이 객체는 아직 아무런 속성도 가지고 있지 않습니다.
  2. super(name) 호출: Dog 클래스의 생성자 내부에서 super(name)을 호출합니다. 이는 부모 클래스인 Animal의 생성자를 호출하는 것입니다.
  3. 부모 클래스 생성자 실행: Animal 클래스의 생성자가 실행되면서 this.name = name; 코드가 실행됩니다. 여기서 this는 새로 생성된 Dog 객체를 가리키고, namesuper(name) 호출 시 전달된 'Buddy' 값입니다.
  4. name 속성 초기화: 결과적으로, Dog 객체의 name 속성에 'Buddy' 값이 할당됩니다. 이것이 바로 name 속성의 초기화입니다.
  5. 자식 클래스 생성자 실행: super(name) 호출 이후, Dog 클래스의 생성자는 계속 실행됩니다. this.breed = breed;를 통해 Dog 객체의 breed 속성을 'Golden Retriever'로 초기화합니다.

따라서, super(name);은 부모 클래스의 생성자를 호출하여 자식 클래스 객체의 name 속성을 처음으로 값을 할당(초기화)하는 역할을 합니다.

초기화의 중요성:

  • 객체의 일관성 유지: 객체가 생성될 때 필요한 속성들을 초기화하여 객체의 상태를 일관되게 유지합니다.
  • 오류 방지: 초기화되지 않은 속성에 접근하려고 하면 예상치 못한 동작이나 오류가 발생할 수 있습니다.
  • 코드 가독성 향상: 객체 생성 시 필요한 초기화 작업을 생성자에 명시적으로 작성하여 코드의 가독성을 높입니다.

핵심:

  • 초기화: 객체 생성 시 속성에 처음으로 값을 할당하는 과정
  • super(name): 부모 클래스의 생성자를 호출하여 자식 클래스 객체의 name 속성을 초기화