📋CS/기초질문

질문5 프로토타입(Prototype) 기반 상속은 무엇인가요?

하얀성 2024. 4. 4. 09:52
  • 질문의도: 자바스크립트의 객체지향 프로그래밍 및 상속 메커니즘에 대한 이해도를 묻습니다.
  • 프로토타입이 무엇인가는 아래 내용을 참조.

https://elecch.tistory.com/652

 

react 질문 모음

내 답안 1. 가상돔을 통해서 좀 더 빠른 렌더링이 가능하지만 dom은 모든 노드, 태그들을 한번씩 렌더링 다 해줘야 함 dom 요소는 html객체로 prototype타입이 정해져 있지만 가상돔을 사용하는 react 요

elecch.tistory.com


면접 대답

자바스크립트의 모든 객체는 `prototype`이라는 속성을 통해 다른 객체를 참조할 수 있습니다. 객체에서 필요한 메서드나 속성이 없을 경우, 자바스크립트는 프로토타입 체인을 통해 이를 찾습니다. 이 과정을 통해 객체는 프로토타입 체인 어디에 정의된 메서드나 속성이라도 사용할 수 있게 됩니다.

 

추가설명 :

'호모사피엔스1' 라는 사람이 있고, 이 '호모사피엔스1' 를 객체라 하면

prototype은 유전자 즉, 호모 사피엔스 그 자체라 할 수 있다.

prototype 체인을 사용한다는 것은  A는 호모사피엔스 생명체1 이라는 것보다

상위 개념인 호모 사피엔스의 유전자 자체에 새로운 특징을 추가하는 것이다.

 

예를 들어 호모 사피엔스에 let tail = true 이라는 특성을 부여.

이제 호모1, 호모2 .... 쭉 새로운 객체가 생길 때마다 tail라는 새로운 특성을 가진 호모1, 호모2가 있는것.

 

예시2

let a = [1,2,3]

도 사실은 let a = new Array(1,2,3)이다.

그래서 a라는 객체는 Array prototype이 지니고 있던 sort(), length()같은 함수를 가지고 있어, 이 함수를 공유해서 쓸 수 있다.

 


 

아래 내용 요약

자바스크립트에서 모든 객체는 prototype이라는 내부 속성을 가지고 있으며, 이 prototype은 다른 객체를 참조할 수 있습니다. 객체에서 메서드나 속성을 호출할 때, 해당 객체에 해당 메서드나 속성이 없다면 자바스크립트는 객체의 프로토타입 체인을 따라 올라가며 해당 메서드나 속성을 찾습니다. 이를 통해 객체는 프로토타입 체인 상의 어느 곳에나 정의된 메서드나 속성에 접근할 수 있습니다.

 

프로토타입 기반 상속의 장점은 유연성과 메모리 효율성에 있습니다. 객체의 프로토타입을 동적으로 변경할 수 있기 때문에, 런타임 중에도 객체의 상속 구조를 변경할 수 있습니다. 또한, 프로토타입을 통해 메서드를 공유함으로써 동일한 메서드를 가진 여러 객체가 메모리에 중복하여 메서드를 저장할 필요가 없어 메모리 사용이 효율적입니다.


프로토타입(Prototype) 기반 상속

function Animal(name) {
    this.name = name;
}

Animal.prototype.speak = function() {
    console.log(this.name + " makes a noise.");
}

const dog = Object.create(Animal.prototype);
dog.name = "Rex";
dog.speak = function() {
    console.log(this.name + " barks.");
}

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

 

Animal.prototype.speak 방식으로 메서드를 선언하는 것은 Animal 함수 생성자를 직접 수정하는 것이 아니라, Animal의 프로토타입 객체에 메서드를 추가하는 것입니다.

이는 Animal을 인스턴스화한 모든 객체가 해당 메서드를 공유하게 되는 것을 의미하며, Animal 함수 자체는 변하지 않습니다.

 

프로토타입을 사용한 메서드 선언은 해당 함수의 prototype 속성에 함수(메서드)를 할당함으로써 이루어집니다. 이 방식을 사용하면, 생성자 함수로 생성된 모든 인스턴스가 이 메서드를 공유할 수 있습니다. 메모리 효율성 측면에서 이점을 가지며, 모든 인스턴스에 동일한 메서드가 필요할 때 주로 사용됩니다.

 


클래스 기반 상속 예시 (Java)

클래스 기반 상속을 사용하는 Java 언어의 예시입니다. 여기서 Animal 클래스는 기본적인 동물을 나타내며, Dog 클래스는 Animal 클래스로부터 상속받아 구체화됩니다.

 

 

예시에서, DogAnimalspeak 메서드를 오버라이드(재정의)하여, Dog 인스턴스가 speak를 호출할 때 "barks"라는 특정 행동을 출력하도록 합니다. 클래스 기반 상속은 상속 관계가 코드 작성 시점에 고정되며, 런타임에는 변경할 수 없습니다.

class Animal {
  String name;

  public Animal(String name) {
      this.name = name;
  }

  public void speak() {
      System.out.println(this.name + " makes a noise.");
  }
}

class Dog extends Animal {
  public Dog(String name) {
      super(name);
  }

  @Override
  public void speak() {
      System.out.println(this.name + " barks.");
  }
}

public class Main {
  public static void main(String[] args) {
      Animal myDog = new Dog("Rex");
      myDog.speak(); // 출력: Rex barks.
  }
}