JavaScript

상속

상속(inheritance)이란?

객체는 연관된 로직들로 이루어진 작은 프로그램이라고 할 수 있다. 상속은 객체의 로직을 그대로 물려 받는 또 다른 객체를 만들 수 있는 기능을 의미한다. 단순히 물려받는 것이라면 의미가 없을 것이다. 기존의 로직을 수정하고 변경해서 파생된 새로운 객체를 만들 수 있게 해준다. 

아래 코드는 이전 시간에 살펴본 코드다.

function Person(name){
    this.name = name;
	this.introduce = function(){
		return 'My name is '+this.name;	
	}	
}
var p1 = new Person('egoing');
document.write(p1.introduce()+"<br />");

결과

My name is egoing

위의 코드를 아래와 같이 바꿔보자.

function Person(name){
    this.name = name;
}
Person.prototype.name=null;
Person.prototype.introduce = function(){
	return 'My name is '+this.name;	
}
var p1 = new Person('egoing');
document.write(p1.introduce()+"<br />");

결과는 같다. 하지만 상속을 위한 기본적인 준비를 마쳤다. 이제 상속을 해보자.

function Person(name){
    this.name = name;
}
Person.prototype.name=null;
Person.prototype.introduce = function(){
	return 'My name is '+this.name;	
}

function Programmer(name){
	this.name = name;
}
Programmer.prototype = new Person();

var p1 = new Programmer('egoing');
document.write(p1.introduce()+"<br />");

Programmer이라는 생성자를 만들었다. 그리고 이 생성자의 prototype과 Person의 객체를 연결했더니 Programmer 객체도 메소드 introduce를 사용할 수 있게 되었다. 

Programmer가 Person의 기능을 상속하고 있는 것이다. 단순히 똑같은 기능을 갖게 되는 것이라면 상속의 의의는 사라질 것이다. 부모의 기능을 계승 발전할 수 있는 것이 상속의 가치다.

function Person(name){
    this.name = name;
}
Person.prototype.name=null;
Person.prototype.introduce = function(){
    return 'My name is '+this.name;	
}

function Programmer(name){
	this.name = name;
}
Programmer.prototype = new Person();
Programmer.prototype.coding = function(){
	return "hello world";
}

var p1 = new Programmer('egoing');
document.write(p1.introduce()+"<br />");
document.write(p1.coding()+"<br />");

결과

My name is egoing
hello world

Programmer는 Person의 기능을 가지고 있으면서 Person이 가지고 있지 않은 기능인 메소드 coding을 가지고 있다. 

prototype이 무엇인가 궁금할 것이다. 이번 시간은 상속에 대한 개념적인 부분만 살펴본 것이고 다음 시간에 prototype에 대한 구체적으로 알아보자.

댓글

댓글 본문
  1. 코딩박
    2023.11.16. JavaScript 입문 수업 - 객체지향 - 상속 파트 수강했습니다.
  2. DreamBoy
    2023.10.14. JavaScript 입문 수업 - 객체지향 - 상속 파트 수강했습니다.
  3. 진진리
    22.05.11
  4. 낀찐
    2022. 02. 05 완료
  5. pmxsg
    2021.12.17 수강
  6. 드림보이
    2021.12.10. 상속 파트 수강완료
  7. GelandeWagen
    Ok
  8. Grit
    감사합니다.
  9. seaWater
    2021. 9. 28. 완료
  10. choi
    완료
  11. labis98
    20210822 good~~~!!!
  12. 낭만고양이
    수강완료
  13. Amousk
    좋은 강의 감사합니다.
  14. 강준원
    Prototype Inheritance
    All JavaScript objects inherit properties and methods from a prototype:

    Date objects inherit from Date.prototype
    Array objects inherit from Array.prototype
    Person objects inherit from Person.prototype

    function person(name)이란 생성자에 새로운 프로퍼티나 메소드를 추가하려면
    생성자를 직접편집해야한다
    하지만 프로토타입을 이용하면 생성자를 건드리지 않고 추가할수있다
    function Person(first, last, age, eyecolor) //생성자
    {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eyecolor;
    }
    //새 객체에 생성자에 없는 프로퍼티 추가
    Person.prototype.nationality = "English"; ---생성자에는 없지만 필요할때 따로 추가할수있다 이렇게

    //새 오브젝트에 생성자에 없는 메소드 추가
    Person.prototype.name = function() {
    return this.firstName + " " + this.lastName;
    };
  15. hanel_
    감사합니다. 21.3.3
  16. 강승
    감사합니다.
  17. 박병진
    2020.10.29 완료
  18. CodingChan
    2020. 09. 06
  19. 한강
    오늘도 감사합니다. :)
    200331
  20. 굼벵이
    완료
  21. arcsine
    그 줄은 딱히 필요 없습니다. JavaScript에서 모든 함수는 객체이며, prototype라는 프로퍼티를 가지고 태어납니다. prototype역시 객체에요. function Person을 만드면 Person.prototype도 자동으로 생성이 되는데, Person.prototype은 constructor와 __proto__라는 프로퍼티를 자동으로 가지고 있어요. 그 외에 프로퍼티는 없습니다 (나중에 더 추가하기 전까진).
    Person.prototype.name = null; 은 Person.prototype에 name이란 프로퍼티를 추가하고 거기에 null이란 값을 주는거죠.
    이거 없이 Person.prototype.name을 쓰려고 하면 undefined가 뜰겁니다. 근데 Person.prototype.name을 만들고 거기에 꼭 null을 이유는 없는 것 같습니다.
    대화보기
    • ㅁㄴㅇㄹ
      ㅎㄷ
      대화보기
      • 홍주호
        20191102 완료
      • 박창신
        완료
      • naomi watts
        egoing님이 설명하지 않으신 프로토타입객체가 여기있어요
        저는 http://www.nextree.co.kr/p7323/ 여기보고 완전 이해했습니다.
      • 생애첫프로그래밍
        Person.prototype.name=null; 은 왜 추가하는 것인가요??ㅜ 아래 댓글에 같은 질문들 있는데 아직 답변은 못찾은 것 같아요..
      • 호두
        고맙습니다
      • Minsu Yun
        감사합니다!
      • choon
        감사합니다.
      • 브베
        옥슬아 따랑해
        대화보기
        • 미완성
          20190109
        • 설명 감사합니다.

          Programmer.prototype = new Person();
          이 문장에 의해 protorype이 의미하는 것이 Programmer의 부모객체를 의미하는 것처럼 보이기 때문에 혼란이 오는 것 같네요.
          대화보기
          • 스탐
            감사합니다.
          • Person.prototype.name=null;
            이 코드를 쓴 이유는 무엇인가요?
          • 영근
            감사합니다!
          • 쏘르
            참 고맙습니다.
          • 옥슬이
            thank God 구체적인 설명 감사합니다
            내용 프린트물 만들어서 필기하고 몇번이고 돌려보고 공부하면서 어느정도
            이해했네요...
          • moon
            감사합니다!
          • 김진홍
            감사합니다!
          • 박인호
            12-19
            수강완료.
            상속이 어떤 매카니즘으로 이루어지는지 바로 듣겠습니다.
          • Jupi
            p1.coding = function() {
            return "hello world";
            }

            위의 코드를 var p1 = new Programmer('egoing'); 아래에 실행시,
            위의 생성자 함수 Programmer에서 prototype으로 지정한 속성 coding을 추가하는 것과 같지만,
            생성자 함수안에 있는가 아닌가 하는것이 다르다.
            만약 prototype으로 속성을 추가하지 않고, 위 코드를 실행한다면
            기본적으로 p1객체가 만들어진 다음에 추가하는 것이므로, 코드의 밀집도를 떨어트리게 된다.

            이렇게 생각해도 될까요??
          • 고스트프리
            감사합니다.
          • 수복
            감사합니다.
          • GoldPenguin
            완료했습니다.
          • 아사다마오리족
            어렵다
          • babyrice
            하하
            갓 배우고 있는 초보자라 아직 이해가 안가네요
            공부해서 다시보면 이해가 되겠지요
            답변 감사합니다.
            대화보기
            • babyrice
              Programmer.prototype.coding은 Programmer가 Person에게서 상속받은 것이 아니라 새 속성을 추가한 것인데 왜 Programmer.coding으로 안쓰고 prototype을 붙인건가요?
              제 생각에 coding은 Programmer의 고유한 것이라 prototype이 없어도 되는 줄 알았는데 없애면 실행이 안되네요.
            • 이승우
              2017/08/07 완료
            • 이승우
              2017/08/07 2/3까지 완료
            • Seo Yun Seok Tudoistube
              부모객체의 prototype 과 상속받은 자식객체의 prototype 이 서로 다르다고 이해하면 되겠네요. 감사합니다^_____^!!!