[TIL] OOP (Object-oriented Programming)

woojun kang·2020년 9월 10일
0

🖥 프로그래밍 언어의 종류


프로그래밍 언어에는 3가지 종류가 있다. 기계어는 컴퓨터의 CPU가 멍령을 처리할 수 있게 0과 1로 구성된 언어이다. 따라서 사람이 이해하기는 너무 복잡해 이를 이용해 프로그래밍을 구축하기 어렵다. 따라서 이를 사람이 이해하기 쉽게 즉, 자연어와 비슷하게 만들어진 언어가 고급언어이다.

  • Machine Langauge(기계어)
  • Assembly Language(어셈블리어)
  • High-Level Language(고급언어)

우리가 사용하는 대부분의 프로그래밍 언어가 고급언어에 속한다. 어셈블리어는 고급언어가 기계어로 바뀌는 과정에서 사용되는 언어이다. 고급언어로 코딩을 하면 이를 1) 컴파일러를 통해 어셈블리어로 변환하고, 2) 어셈블리어를 어셈블러를 통해 기계어로 바꾸는 작업을 해야 비로소 우리가 짠 코드를 컴퓨터가 이해하고 처리할 수 있다.

⚙️ 객체지향 언어의 특징


절차지향 언어(Process-oriented Programming)
: 순차적으로 처리되는 것이 중요시되는 언어로써 객체지향 언어에 비해 처리 속도가 빠르다는 특징이있다. 반면에 순서를 반드시 지켜야 되고, 코드를 재사용하기 어렵다. 이러한 이유로 유지보수가 어렵다는 단점이 있다.

: 객체지향 언어(Object-oriented Programming)은 절차지향 언어와 달리 코드를 기능별로 묶어 모듈화를 한다. 이로써 중복으로 연산하지 않고 모듈 재활용이 가능하다. 이로써 코드의 유지보수가 수월하다는 장점이 있다.

객체지향 언어의 대표적인 특징으로는 4가지가 있다.

  1. Abstraction
  2. Encapsulation
  3. Inheritance
  4. Polymorphism

1. Abstraction: 추상화

  • 구체적인것은 숨긴 채 대표적인 것만 나타냄
  • 예를들어 핸드폰으로 통화를 할때 핸드폰에 전화번호만 입력하면 전화가 간다. 핸드폰 화면에는 상대방의 전화번호정도만 보인다. 이 전화가 어떠한 원리로 상대방과 통화를 가능하게끔 하는지는 모른다. 이것이 abstraction이다.
  • 즉, 전화라는 class를 정의하는 것 = 추상화

2. Encapsulation: 캡슐화

  • Method와 data를 하나의 캡슐(class)에 저장하는 것
  • Encapsulation = Abstraction + Data Hiding

3. Inheritance: 상속

  • 부모 객체의 속성과 method를 물려받는 것
  • 예를들어 iphone, galaxy 등 여러 휴대폰이 있을때 전화라는 class가 갖는 속성과 method를 그대로 물려받아 사용하는 것.
  • 더해서 전화라는 부모 객체가 갖지 않는 기능(영상통화기능)도 추가할 수도 있다.(extends)
  • 상속으로 인해 함수의 재사용성이 크게 증가한다.

4. Polymorphism: 다형성

  • 부모 객체에서 물려받은 것을 자식 객체에서 각 각 사용하는 것.
  • 전화를 거는 기능을 물려받고 이를 실행했을때, iphone과 galaxy는 각 각 다르게 기능을 수행하는게 가능하다.(오버라이딩, overriding) 예를들어 전화를 걸어! 했을 때 iphone은 facetime으로 전화가 가게 만드는 것.
  • 파라미터가 달라서 구현이 다른경우를 overloading이라 하는데 이는 자바스크립트에 없다.

OOP, 객체지향은 한 마디로 "사람이 세계를 보고 이해하는 방법을 흉내낸 방법론"


🚗 Instantiation Patterns


: ES6 class가 나오기 전 JavaScript를 객체지향적으로 사용하기 위해 다양한 방법을 사용했다. 인스턴스를 만드는 과정(클래스 선언 방식), Instantiaion Pattern에는 크게 4가지가 있다. Class는 하나의 정형화된 모델을 만들어, 이를 기반으로 인스턴스(복제품)을 만들기 위해 사용한다. 즉, 코드의 재사용성을 대폭 늘려준다.

1. Functional

var Car = function() {
  var somInstance = {};
  someInstance.position = 0;
  someInstance.move = function() {
    this.position += 1;
  }
  return soneInstance;
};
var car1 = Car();
var car2 = Car();
car1.move();

2. Functional Shared

var extend = function(to,from) {
  for(var key in from){
    to[key] = form[key];
  }
};

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

var Car = function(position){
  var someInstance = {
    position: position,
  };
  extend(someInstance, someMethods);
  return someInstance;
};
var car1 = Car(5);
var car2 = Car(10);
                    

3. Prototypal

var someMethods = {};
someMethods.move = function() {
  this.position += 1;
};
var Car = function(position) {
  // 특정 객체를 prototype으로 하는 객체
  var someInstance = Object.create(someMethods); 를 생성
  someInstance.position = position;
  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);

0개의 댓글