TIL #1 // 컴퓨터 프로그램, OOP, Prototype

이윤주·2019년 12월 27일
0

컴퓨터 프로그램

컴퓨터 프로그램은 일종의 알고리즘이 모여 특정 프로그램(step by step program)이 만들어 지는 것을 말한다. 그리고 프로그램을 개발 할 수 있도록 도와주는 tool은 처리 수준에 따라 3가지(Machine language, Assembly language, High level language)가 있다.

1. Machine language(기계어)

1과 0으로 조합되는 2진수 언어로 이루어 져 있어 컴퓨터 기계가 직접 이해할 수 있다. 하지만 사람이 직접 2진법으로 프로그래밍하기는 어렵다.

2. Assembly language(어셈블리 언어)

컴퓨터공정을 돌리기 전에 machine language를 번역할 수 있게 함으로써 기계어와 일대일 대응이 가능한 언어이다. 명령어가 10개정도 밖에 없다

3. High level language(고급 언어)

어셈블리 언어로 미리 쓴 함수들을 만들어 특정 언어를 이용해 만들어 사람이 이해하기 쉽게 작성된 프로그래밍 언어(C, JAVA, JavaScript,... 등)이다. 저급 언어(어셈블리, 기계어) 보다 유연하고, 사용, 실행하기 쉽다. 고급언어는 역사적으로 절차지향적 언어, 그리고 객체지향적 언어로 이루어져 있다.

객체지향 프로그래밍

객체지향 프로그래밍(Object-Oriented Programming, OOP)이란?

객체지향 프로그래밍이란 컴퓨터 프로그래밍에 필요한 데이터들을 객체에 모아 추상화 하여 만드는 프로그래밍 패턴을 말한며, 사람이 세계를 보고 이해하는 방법을 흉내낸 방법론이라 할 수 있다. 절차지향적언어보다 재사용성과 유지보수성이 높다. 객체를 자동차로 예를 든다면 자동차의 틀(class)을 만들고 그 틀을 바탕으로 세부사항(instance)를 집어놓으면 자동차(객체)가 생성된다.

객체지향 프로그래밍의 기본적 컨셉은 4가지로 이루어 진다.

1. Encapsulation(캡슐화)

: 외부에서 속성들을 object안에 쌓아놓는것

2. Inheritance(상속)

: 부모의 속성과 기능을 물려받는것. 상위객체의 틀(class)을 기반으로 생성된 하위 객체의 틀은 상위객체의 속성과 기능을 그대로 사용 할 수 있다.

3. Abstraction(추상화)

: 복잡한 정보는 숨기고 중요한 정보만을 표현해서 프로그램을 겉으로 보기에 간단하게 만드는 것
ex) 전화를 쓸 때 사용자는 버튼을누르고 듣고 말하기만 하면 된다.

4. Polymorphism(다형성)

부모에게서 물려받은 기능으로 자식이 다양한 형태를 다지는것.

JavaScript에서 Object를 생성하는 방법은 4가지로 나뉜다.

1. Functional

모든 메소드를 someInstance에게 할당하기 때문에 인스턴스를 만들때 메소드 수 만큼의 메모리를 차지해 비효율적이다.

var Car = function() {
  var someInstance = {}; // Car라는 함수를 실행할 때 찍어내 줄 객체 선언
  someInstance.position = 0//  someInstance의 position을 0으로 초기화 해줌
                           // => instance를 새로 찍을때마다 0으로 초기화 됨
  someInstance.move = function() { // someInstance에 move라는 메소드 추가
    this.position += 1; // this는 someInstance => someInstance.postion += 1
  }
  return someInstance
}
var car1 = Car();
console.log(car1) // {position: 0, move: ƒ}
car1.move()
console.log(car1) // {position: 1, move: ƒ}
var car2 = Car();
console.log(car2) // {position: 0, move: ƒ}
car2.move()
console.log(car2) // {position: 1, move: ƒ}

2. Functional Shared

functional과 비교했을 때 someMethods라는 객체에 있는 메소드들의 메모리 주소만을 참조하기 때문에 메모리 효율이 높아진다.

var extend = function(to, from) { //3. someInstance와 someMethods를 합치는 extend함수를 만들어서 Car함수 내부에 합쳐줌
debugger;  
for(var key in from) {
    to[key] = from[key];
  }
}

var someMethods = {}; // 2. method를 담아줄 객체를 생성 모든 메소드는 someMethods에 담을 것
someMethods.move = function() {
  this.position += 1;
};

var Car = function(position) {
  var someInstance = {
    position: position,  
}
  extend(someInstance, someMethods); //3.
  return someInstance; // 1. Car 함수 선언. position을 someInstance의 property로 넣어줌
};

var car1 = Car(5);
console.log(car1) // {position: 5, move: ƒ}
var car2 = Car(10);
console.log(car2) // {position: 10, move: ƒ}

3. Prototypal Instantation

Functional Shared방식과 비슷하나 Object.create를 이용한다.

var someMethods = {}; 
someMethods.move = function() {
  this.position += 1;
};

var Car = function(position) {

  var someInstance = Object.create(someMethods); // someMethods를 프로토타입으로 하는 객체를 생성
console.log(someInstance)
  someInstance.position = position
  return someInstance 
};

var car1 = Car(5); // {position: 5, move: ƒ}
var car2 = Car(10); // {position: 10, move: ƒ}

4. Pseudoclassical

new operator를 이용하여 생성한다. 가장 많이 사용되는 방법이다.

var Car = function(position) {
  this.position = position;
}

Car.prototype.move = function() {
  this.position += 1;
}
var car1 = new Car(5); // {position: 5, move: ƒ}
var car2 = new Car(10); // {position: 10, move: ƒ}

Prototype

JavaScript에서 function은 모두 Object로 이루어져 있다. 즉 모든 function들은 Object이기 때문에 objectprototype을 이용할 수 있다. 그렇다면 prototype을 이용하면 어떤 장점이 있을까?

function Car() {} // 만약내가 Car라는 function을 만들었다고 하자. 
Car.prototype.wheel = 4;
Car.prototype.handle =  1;
// 그리고 Object.prototype을 이용하여 Car함수에 객체 속성을 참조하게 만든다. 

var avante  = new Car(); // avante를 Car 함수를 통해 생성한다.
console.log(avante.wheel) // 4
avante.__proto__  // {wheel: 4, handle: 1, constructor: ƒ}

이렇게 object의 protype 특성을 이용한다면 Car 함수를 이용해 생성된 avante는 Car의 __ proto __ 에 접근 할 수 있다. 따라서 avante라는 변수에 새로운 메모리가 생성되는 것이 아닌 Car.prototype을 참조하여 Car의 속성을 공유해 메모리의 할당을 줄일 수 있다.

0개의 댓글