#4 (Object Oriented Programming)

Angelo·2020년 6월 17일
0
post-thumbnail

Object Oriented Programming

HighLevel Language는 두가지로 나뉜다

  • function 위주의 Procedural language (절차 지향적언어, 순차적으로 진행, ex.C,COBOL,Fortran)

  • 객체 위주의 Object-Oriented languages(OOP)

더 나은 프로그램을 만들기 위한 프로그램 패러다임이다. Object로만 구성해
재사용성을 높게 만들어주고 기능과 속성들을 하나의 Object에 담는다.

예를들어 class(Car === 차)라는 프로토타입, 즉 블루프린트를 이용해
세부사항(Car의 기능,속성)을 입력하면 Object(BMW)가 된다.

OOP Basic Concepts

1. Encapsulation

: 외부에서 속성들을 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();

2. Inheritance

: 부모의 특징을 상속받는 개념, 상속받아 수정 가능. 같은 코드가 겹치지 않게 도와줌

class NormalCar {
  // key (private)
  // speed: 155
  // Engine : 3.2L --
}
class SpeedCar extends normalCar {
  // speed : 165
  // weight : 1399kg

3. Abstraction

: 추상화의 개념. 속은 복잡한 구성(Encapsulation)이지만 사용자는 쉽게 사용 가능(Abstraction).

전화기를 예를들어 내부는 복잡하게 구성되어 있더라도
사용자는 구성을 모름에도 불구하고 쉽게 사용

4. Polymorphism

: 다형성, 여러가지 형태라는 개념 (Poly morphism === Many form).

예를들어 애완동물을 기르는 주인이 speak 이라는 명령어를 주었을때
각각의 동물의 대답이 다름

Instantiation

: 인스턴스를 만드는 과정

Instantation Patterns
자바스크립트에 class가 나오기전 4가지 class 선언 방식

1. Functional

: 함수를 이용

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);

2. Functional Shared

: 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);

3. Prototypal

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);

4.Pseudoclassical

// 가장 많이 쓰이는 방식

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

프로토타입 링크

  • 자바스크립트 언어는 동적인 언어이고 클래스가 없다. 프로토타입 기반의 언어

  • 상속 관점에서 자바스크립트의 유일한 생성자는 객체이다.
    각각의 객체는 Prototype이라는 속성을 가지는데 자신의 프로토타입이 되는 다른 객체를 가리킨다.
    그 객체의 프로토타입또한 프로토타입을 가지고 있고 이것이 반복된다.
    결국 null(프로토타입 체인의 종점역할)을 프로토타입으로 가지는 오브젝트에서 끝이 난다.

profile
나만의 학습 노트

0개의 댓글