프론트엔드/JavaScript

자바스크립트의 상속 (inheritance)

ksge7 2020. 9. 14. 14:35

상속이란?

자바에서 상속은 클래스 단위로 이루어졌다.

 

자손 클래스는 'extend'를 통해 부모 클래스의 속성값을 물려 받았다.

 

자바 스크립트에서도 상속은 비슷한 의미로 쓰인다.

 

하지만 그 대상이 다르다. 자바 스크립트에서 상속은 클래스가 아닌 객체를 기준으로 이뤄진다.

 

왜 객체?

자바 스크립트는 과거 클래스가 없을 때부터 객체를 중심으로 프로그램을 짰다.

 

그래서 클래스 대신 객체를 상속하는 것으로 클래스를 대신했다.

 

그리고 이 중심에는 'prototype'이라는 속성이 있다.

 

프로토타입(proto type)

프로토타입(proto type)이란 자바 스크립트에 존재하는 모든 객체가 가지는 속성값을 말한다.

 

이 속성은 객체로서 상속 과정에 필요한 다양한 정보를 담고 있고 사용자가 추가, 수정할 수 있다.

 

그리고 모든 상속은 이 프로토타입을 기준으로 이뤄진다.

 

프로토타입의 상속

<body>
    <script>
        function Person(name){  // Person 객체 생성
            this.name = name;
        }

        Person.prototype.introduce = function(){
            // Person.prototype.introduce에 함수를 저장
            return "나는 "+this.name+"입니다.";
        }

        var p1 = new Person("영수");  // Person 객체 생성
        console.log(p1.introduce()); // Person 객체 p1으로 introduce에 저장된 함수 호출

        function Student(name){  // student 객체 생성
            this.name = name;
        }

        Student.prototype = new Person();  // Student.prototype 속성에 new와 함께 Person 객체 생성을 하도록 저장

        var s1 = new Student("철수");  // Student 객체 생성

        console.log(s1.introduce());  // Student으로 Person에서 만들었던 함수 introduce 호출
        
    </script>
</body>

다음은 프로토타입 상속의 예시다.

 

'Person'이라는 객체를 만들어주고 객체에 'introduce'라는 함수를 추가해줬다.

 

'Student'라는 객체를 만들어주고, 해당 객체의 프로토타입에 'new Person'이라는 'Person' 객체의 객체 생성자를 저장했다.

 

그 결과는 'Student' 객체를 만들 때 프로토타입이 속성이 생성되는데 이 프로토타입에 'Person' 객체의 생성자가 저장되있어서 'Student'를 통해 'Person'의 프로퍼티와 함수를 사용할 수 있게 된 것이다.

 

프로토타입 상속 과정

<body>
    <script>

        function First(){}
        First.prototype.test = "상속";  // first 객체의 프로토타입에 프로퍼티 test 저장

        function Second(){}
        Second.prototype = new First(); //Second의 프로토타입에 first 객체 생성자 추가

        function Third(){}
        Third.prototype = new Second(); //Third의 프로토타입에 Second 객체 생성자 추가

        var test = new Third();  // third의 객체 생성
        console.log(test.test);
        // third의 객체로 Fisrt 프로토 타입에 저장한 프로퍼티 test출력

    </script>
</body>

 

직접적인 상속 과정이 복잡하다면 위 코드를 보면 더 쉽게 이해가 가능하다.

 

기본적으로 자바 스크립트의 모든 객체는 프로토타입이라는 객체 형태의 속성 값을 생성과 동시에 부여 받게 된다.

 

그리고 이 프로토타입이란 속성에 상속받을 생성자를 부여함으로써 객체를 새로 생성할 때마다 상속 받은 생성자를 같이 생성하기 때문에 상속을 통해 받은 프로퍼티와 메소드를 사용할 수 있는 것이다.

 

위의 코드를 해석하자면 다음과 같다.

 

'Third' 객체의 프로토 타입은 Second의 생성자를 저장했다.

 

'Second' 객체의 프로토 타입은 First의 생성자를 저장했다.

 

즉 'Third' 객체를 새로 생성하게 될 때 마다 프토로타입에 저장된 생성자를 통해 'Second'와 'First'의 객체까지 생성해서 사용할 수 있게 만드는 것이다.

 

이렇게 상속을 통해 이뤄지는 프로토타입의 연쇄 작용을 프로토타입 체인이라 한다.