Codestates/Full IM

Object Oriented Programming + Instantiation

Hello, Big stranger 2020. 7. 29. 15:49

OOP(Object Oriented Programming)?

 

프로그램밍의 패러다임 중 하나이며, 객체 지향 프로그래밍이라고 한다. 말 그대로 프로그램을 작성하는데 함수나 로직 기반보다는 객체 기반으로 한 패러다임이라고 보면된다. 여기서 객체는 속성과 동작을 가진 데이터 필드로 정의된다. 쉽게 말하자면 모든 것을 물체로 정의하려는 프로그래밍 패러다임이라고 보며 되며 , 크고 복잡한 문제들을 관리하는데 적합하다고 보면 된다.

 

OPP Basic concept (객체 지향 프로그래밍의 특징)

 

기본적인 개념으로 Encapsulation, Inheritance, Abstraction, Polymorphism이 있다.

 

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

nheritance(상속)

부모의 특징을 상속받는 개념으로 상속받아 수정이 가능하며 같은 코드를 작성하지 않아도된다.

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

Abstraction(추상)

속은 복잡한 구성이지만 사용자는 쉽게 사용가능하게 만드는 것이며 같은 속성을 가지고 있더라도 원하는 기능에 따라서 이를 모으는것이다.

 

Polymorphism(다형성)

한가지의 형태로 여러가지 기능을 수행할 수 있는것이며 그 예로는 애완동물을 기르는 주인이 말이라는 명령어를 주었을때 각각의 동물의 대답이 다르다라는 것을 보면 된다. (Poly morphism === Many form)

 

OPP 장점과 단점

 

장점은 코드의 재사용이 용이하며, 유지 보수가 쉽고 때문에 대형 프로젝트에 적합하게 사용된다.

단점은 절차형 보다는 처리 속도가 상대적으로 느리며 객체가 많으면 어쩔 수 없이 용량이 커질 수 밖에 없으며 설계할 때 많은 시간과 노력이 필요하다.

JavaScript에서 Object를 생성하는 방법들은 다음과 같다.

 

JavaScript에서 Prototype은 무엇이고 왜 사용해야 하는가?

 

JavaScript에서 Prototype은 자바스크립트를 사용하는데 있어서 아주 중요한 개념이다. 자바에서의 class처럼 활용이 가능해서 instance 생성이 가능하며, Prototype은 객체의 부모 객체인데 생성자 함수와는 다르게 prototype 객체가 따로 존재하며 이를 활용해서 자식 객체는 메소드를 가지고 있지 않아도 prototype 객체에서 가져다가 사용이 가능하다.


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

someNethods라는 객체에 있는 메소드들의 메모리 주소만을 참조하기 때문에 메모리 효율이 좋아진다.

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 가능

 

'Codestates > Full IM' 카테고리의 다른 글

Inheritance patterns  (0) 2020.07.30
Understanding Prototype Chain  (0) 2020.07.29
Data Structure Time Complexity  (0) 2020.07.27
Data Structure Graph, Tree, BST  (0) 2020.07.27
Data Structure Linked List, HashTable  (2) 2020.07.24