HighLevel Language는 두가지로 나뉜다
function 위주의 Procedural language (절차 지향적언어, 순차적으로 진행, ex.C,COBOL,Fortran)
객체 위주의 Object-Oriented languages(OOP)
더 나은 프로그램을 만들기 위한 프로그램 패러다임이다. Object로만 구성해
재사용성을 높게 만들어주고 기능과 속성들을 하나의 Object에 담는다.
예를들어 class(Car === 차)라는 프로토타입, 즉 블루프린트를 이용해
세부사항(Car의 기능,속성)을 입력하면 Object(BMW)가 된다.
: 외부에서 속성들을 Object에 쌓아 캡슐화 시키는 개념.
복잡도를 줄여주고 재사용성을 높여준다.
// 절차지향적 방법
let baseSalary = 30_000;
let overtime = 10;
let rate = 20;
function getWage(baseSalary, overtime, rate) {
return baseSalary + (overTime * rate);
}
// 객체 지향적 방법
let employee = { // employee라는 객체를 만들어 캡슐화
baseSalary : 30_000,
overtime : 10,
rate: 20,
getWage : function() {
return this.baseSalary + (this.overtime * this.rate);
}
};
employee.getWage();
: 부모의 특징을 상속받는 개념, 상속받아 수정 가능. 같은 코드가 겹치지 않게 도와줌
class NormalCar {
// key (private)
// speed: 155
// Engine : 3.2L --
}
class SpeedCar extends normalCar {
// speed : 165
// weight : 1399kg
: 추상화의 개념. 속은 복잡한 구성(Encapsulation)이지만 사용자는 쉽게 사용 가능(Abstraction).
전화기를 예를들어 내부는 복잡하게 구성되어 있더라도
사용자는 구성을 모름에도 불구하고 쉽게 사용
: 다형성, 여러가지 형태라는 개념 (Poly morphism === Many form).
예를들어 애완동물을 기르는 주인이 speak 이라는 명령어를 주었을때
각각의 동물의 대답이 다름
: 인스턴스를 만드는 과정
Instantation Patterns
자바스크립트에 class가 나오기전 4가지 class 선언 방식
: 함수를 이용
var Car = function() { // car라는 함수 생성
var someInstance = {}; //객체 선언
someInstance.position = 0; //인스턴스의 초기값은 항상 0
someInstance.move = function() {
//someInstance에 move라는 메소드 추가
this.position +=1;
// this는 someInstance를 뜻하므로 thisposition은
//someInstance.position과 같고 실행시 position 값이 1만큼 증가
}
return someInstance;
};
var car1 = Car();
var car2 = Car();
car1.move();
// car1.move()를 실행한 후의 car1을 console.log
// 찍어보면 postion 이 1인것을 확인할 수 있다
-----------
var Car = function(position) { // 초기위치를 지정해 줄수도 있다
var someInstance = {};
someInstance.position = position;
someInstance.move = function() {
this.position += 1;
}
return someInstance;
};
var car1 = Car(5);
: someMethods라는 객체에 있는 메소드들의 메모리 주소만을 참조하기 때문에 메모리 효율이 좋아진다
var extend = function(to, from) {
// someInstance와 someMethods를 합치는 extend 함수를 만들어
// Car함수 내부에서 합쳐준다
for(var key in from) {
to[key] = from[key];
}
};
var someMethods = {}; // 메소드를 담아줄 객체 생성 move함수를 담는다
someMethdos.move = function() {
this.position +=1;
};
var Car =function(position) { // car 함수 선언
var someInstance = {
// positiondms someInstance의 property로 넣어준다
position: position,
};
extend(someInstance, someMethods);
return someInstane;
};
var car1 = Car(5);
var car2 = Car(10);
var someMethods = {}; // 메소드 담을 객체 생성
someMethods.move = function() {
this.position +=1;
};
var Car = function(position) { // Car 함수 선언
var someInstance = {};
someInstance.position = Object.creat(someMethods);
// Object.create는 특정 객체를 프로토타입으로 하는 객체를 생성해 주는 함수
return someInstance;
};
var car1 = Car(5);
var car2 = Car(10);
// 가장 많이 쓰이는 방식
var Car = function(position) {
this.position = position;
};
Car.prototype.move = function() { // 메소드를 프로토타입으로 만들어준다
this.position +=1;
};
var car1 = new Car(5);
var car2 = new Car(10); // new operator를 붙여야 console 가능
자바스크립트 언어는 동적인 언어이고 클래스가 없다. 프로토타입 기반의 언어
상속 관점에서 자바스크립트의 유일한 생성자는 객체이다.
각각의 객체는 Prototype이라는 속성을 가지는데 자신의 프로토타입이 되는 다른 객체를 가리킨다.
그 객체의 프로토타입또한 프로토타입을 가지고 있고 이것이 반복된다.
결국 null(프로토타입 체인의 종점역할)을 프로토타입으로 가지는 오브젝트에서 끝이 난다.