OOP(Object Oriented Programming, 객체 지향 프로그래밍)는 컴퓨터 프로그래밍의 패러다임 중 하나이다. 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(object)'의 단위로 나누고 이들의 상호작용으로 보는 방식이다. 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 봐야 한다.
객체 지향 프로그래밍의 4가지 주요 개념에 대해 알아보자.
function makeCounter() {
let level = 0 // 속성
return {
increase: function() { // 메소드
level++
},
decrease: function() {
level--
},
getLevel: function() {
return level;
}
}
} // 클래스 사용자가 직접 level에 접근할 수 없고, getLevel만 이용가능하다.(은닉)
let counter1 = makeCounter()
counter1.increase()
counter1.getLevel() // 1
let counter2 = makeCounter()
counter2.decrease()
counter2.decrease()
counter2.getLevel() // -2
하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것
자바스크립트는 흔히 프로토타입 기반 언어라고 불린다.
자바스크립트의 모든 객체는 자신의 부모 객체와 연결되어 있는데, 이것은 객체 지향의 상속개념과 같이 부모 객체의 속성과 메소드를 상속받아 사용할 수 있게 한다.
이러한 부모 객체를 프로토타입 객체 또는 줄여서 프로토타입이라 한다.
프로토타입 객체도 또 다시 상위 프로토타입 객체로부터 메소드와 속성을 상속 받을 수도 있고 그 상위 프로토타입 객체도 마찬가지이다. 이를 프로토타입 체인(prototype chain)이라 부른다.
function Ultra(){
Ultra.prototype.ultraProp = true;
}
function Super(){
Super.prototype = new Ultra();
}
function Sub(){
Sub.prototype = new Super();
}
var o = new Sub();
console.log(o.ultraProp); // true
o.ultraProp을 출력하는 메커니즘은 아래와 같다.
prototype
은 객체와 객체를 연결하는 체인의 역할을 한다.prototype
은 함수만 가지는 속성이며, __proto__
는 모든 객체가 빠짐없이 가지고 있는 속성이다.super 키워드는 부모 객체의 함수를 호출할 때 사용된다.
extends 키워드는 클래스를 다른 클래스의 자식으로 만들기 위해 class 식에 사용된다.
super, extends 예시 ⬇️
class Person{
constructor(name, first, second) {
this.name = name;
this.first = first;
this.second = second;
}
sum() {
return this.first + this.second;
}
}
class PersonPlus extends Person {
constructor (name, first, second, third) {
super(name, first, second);
this.third = third; // 부모 객체에 없는 키를 추가해준다
}
sum() { // 부모객체에 있는 함수를 쓸 수 있다.
return super.sum() + this.third;
}
avg() {
return (this.first + this.second + this.third)/3;
}
}
let kim = new PersonPlus("kim", 10, 20, 30)
console.log(kim.sum()); // 60
console.log(kim.avg()); // 20
instanceof 연산자는 object의 프로토타입 체인에 constructor.prototype이 존재하는지 판별한다.
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var mycar = new Car("Honda", "Accord", 1998);
var a = mycar instanceof Car; // returns true
var b = mycar instanceof Object; // returns true
⬇️ 동기분이 공유해주신 블로그가 프로토타입을 이해하는 데 아주 도움이 되었다.
https://medium.com/@bluesh55/javascript-prototype-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f8e67c286b67