Prototype 에 기반한 객체지향 프로그래밍(OOP)

Mono crom·2021년 1월 8일
0

0. Intro

객체 지향 프로그래밍( OOP : Object Oriented Programming ) 이란, 만물객체설의 관점에서 객체들을 유기적으로 상호작용시키는 방식으로 로직을 구성하는 객체중심의 프로그래밍 패러다임이다.

OOP 는 ① 프로토타입 기반 프로그래밍과 ② 클래스 기반 프로그래밍으로 나뉘는데, 자바스크립트는 ES6부터 클래스 키워드를 지원하기 시작했으나 아직 프로토타입 기반이 주를 이루고 있다.

따라서 이하에서는 자바스크립트에서의 프로토타입 기반 OOP에 대해 서술한다. 쭈욱 읽다보면 마지막에 프로토타입 기반의 OOP가 무엇인지 정리될 수 있게끔 글을 구성하였다.




1. 프로토타입(Prototype)을 왜 사용하는가


자바스크립트의 함수 객체는 기본적으로 prototype 프로퍼티를 가지고 있다. 이 프로퍼티의 값은 null 또는 객체이며, "프로토타입 상속" 동작을 실현하기 위해 존재한다. 본격적인 상속을 이해하기 전에 prototype 객체의 존재를 확인해보자.

function Person(name, home) {
  this.name = name;
  this.home = home;
}

console.log(Person.hasOwnProperty('name')) // true


Person.prototype.where = function() {
  console.log(`${this.name} lives in ${this.home}`)
}

const me = new Person("Crom", "Seoul");

me.where(); // "Crom lives in Seoul"

person 객체에는 hasOwnProperty 라는 프로퍼티가 존재하지 않지만 잘 동작한다. 이는 person 함수가 자신에게 hasOwnProperty 프로퍼티가 없으면 자신과 연결되어 있는 prototype 객체가 해당 프로퍼티를 가지고있는지 조회하며, 존재할 경우 그 프로퍼티를 자신의 것처럼 빌려다 쓰기 때문이다.

실제로 prototype 객체는 hasOwnProperty 프로퍼티를 기본적으로 내장하고 있기 때문에 person 객체가 이를 빌려다 사용해 true 라는 결과를 출력할 수 있었다.

그 다음 prototype 프로퍼티에 where 메서드를 추가해 주었으며, 상술한 것과 같은 동작원리로 Person 객체는 where 메서드를 prototype 객체로부터 빌려와 사용할 수 있게 된다. 그 결과로 me 인스턴스가 where 메서드를 사용할 수 있게 되는 것이다.

이처럼 객체들간에 연결고리를 만들고 이쪽 객체에서 저쪽 객체의 프로퍼티에 접근할 수 있도록 하는 동작방식은 아주 효율적인 객체지향 프로그래밍을 가능케 하였다.




2. 프로토타입의 상속(Inheritance)


2.1 상속의 의미

자바스크립트에서 상속(Inheritance)은 일반적으로 어떤 객체가 다른 객체로부터 기능(프로퍼티 또는 메서드)을 이어받는 것을 의미한다. 상속을 사용하면 이미 만들어진 프로퍼티와 메서드를 재사용할 수 있고, 새로운 기능을 추가해 확장버전의 객체를 만들 수도 있고, 동일한 코드의 중복을 제거할 수 있다.

2.2 프로토타입 체인

const obj = {};
console.log(obj.__proto__); // object {}  <--obj는 빈 객체로 보이지만 __proto__ 프로퍼티를 가지고 있다.

모든 객체는 __proto__ 프로퍼티를 가지고 있으며, 이는 앞서 설명한 함수 객체의 prototype 프로퍼티와는 다른 객체이다. __proto__ 프로퍼티는 그 해당 객체에게 상속을 해 준 부모 객체를 가리킨다. 따라서 객체는 __proto__ 프로퍼티가 가리키고 있는 부모 객체의 프로퍼티에 접근해 사용할 수 있게 된다.

const ramyun = { noodle: true };
const shinRamyun = { taste: hot };

shinRamyun.__proto__ = ramyun;

console.log(shinRamyun.noodle) // true

shinRamyun 객체는 noodle 프로퍼티를 가지고 있지 않지만, __proto__ 프로퍼티를 사용해 ramyun 객체를 부모 객체로 설정함으로써 shinRamyun 객체는 ramyun 객체의 프로퍼티를 상속받아 사용할 수 있게 되었다.

이렇게 객체는 자신이 가지고 있지 않은 프로퍼티를 __proto__ 프로퍼티가 가리키는 부모 객체로 거슬러 올라가면서 검색하는데, 이러한 객체간의 연결고리를 프로토타입 체인이라고 한다.




3. 세줄 정리


  1. __proto__ 프로퍼티가 가리키는 부모 객체는 자신의 프로퍼티를 상속하며,

  2. 상속해준 객체*를 상속받은 객체의 프로토타입 이라고 한다.

  3. 그리고 객체의 프로토타입 상속 지향하는 프로그래밍을 가리켜 프로토타입 기반의 객체 지향 프로그래밍 이라고 한다.



profile
니가 진짜로 원하는게 뭐야

0개의 댓글