FE BE 개발 메모장/알고리즘과 자료구조(JS)

OOP(Object-Oriented Programming)

객체(Object)

 객체는 실제로 존재하는 어떠한 대상(실체한 사물)의 데이터와 그 데이터의 관련된 동작을 포함하는 개념이다.

객체 지향 프로그래밍(Object-Oriented Programming)

 객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로, 어떠한 문제의 데이터를 추상화 시켜 상태와 행위를 가진 독립된 여러 객체를 만들고, 그 객체들 간의 상호작용으로 결과를 반환하는 프로그래밍 기법이다.

 

 예를 들자면 필요한 컴퓨터 청사진이 있다. 그 청사진을 Class라고 부른다. 컴퓨터를 실행시키기 위해서는 다양한 부품들이 존재하는데, 대표적으로 CPU, 메인보드, 램  메모리, 그래픽카드, SSD 또는 하드, 파워 서플라이, 쿨러, 화면을 출력할 모니터까지 이 각각의 독립된 객체(부품)들이 모여서 동작할 수 있는 것처럼. 각각의 객체를 추상화 하고, 서로 상호작용 시켜 하나의 결과를 도출하는 방법이다.

                                <Class>
                               Computer
                  <Porperty>                         <Methods>
<object>   CPU        => 제조사:, 모델명:, 코어/스레드: => ...<연산>
           MainBoard  => 제조사:, 모델명:, 규격:       => ...<전기분배>
           VGA        => 제조사:, 모델명:, 규격:       => ...<연산>
           RAM        => 제조사:, 모델명:, 용량:       => ...<저장 후 처리>
           PSU && battery => 제조사:, 모델명:, 출력:   => ...<전원공급>
           SSD        => 제조사:, 모델명:, 용량:       => ...<저장>

                                <instance>
            서버용 컴퓨터, 게이밍 컴퓨터, 사무용 컴퓨터, 노트북, 게이밍 노트북

//특정 컴퓨터를 만들기 위해선 Desktop 또는 laptop이 있다. => Class

//컴퓨터안에는 다양한 부품들이 존재한다 => Object

//특정 컴퓨터는 다양한 종류가 있다. 게이밍, 서버, 사무용 등등  => instance

//컴퓨터를 실행 하기 위한 부품들이 다양하게 존재하는데, 각 부품마다 정해진 정보가 존재한다 => Property

//각 컴퓨터 부품에는 정해진 작업들을 수행한다 => Methods

//작업장 혹은 작업대가 필요하다 => Constructor

객체 지향 프로그래밍의 탄생

 

출처 - dduddublog.tistory.com/8

         ko.wikipedia.org/wiki/절차지향 프로그래밍

OOP 특징

  • 추상화(Abstraction)

추상화는 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.

 

더 자세한 예로는 게임의 종류를 예로 들어보자

 예를 들면 콜오브듀티, 스타크래프트2, 하프라이프, 리그오브레전드 등등 다양한 게임들을 FPS, AOS, RTS와 같이 장르별로 묶어놓는다. 이렇게 추상화를 한번 거치고, 최정적으로는 컴퓨터 게임 이라는 하나의 개념안에 묶어 둔다. 이러한 개념을 추상화라고 생각한다.  

 

  • 캡슐화(Encapsulation

데이터의 속성(attribute)과 어떠한 행위(method)를 하나의 틀 안에 묶는것을 캡슐화라 한다. 

 

즉, 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한군데에 묶는다고 생각한다. 캡슐화를 하는 이유는 객체에 대한 구체적인 정보를 노출시키지 않도록 하기 위한 기법이다.  

 

  • 상속(Inheritance)

이미 정의된 상위 개념(부모 클래스)의 특징을 하위 개념(자식 클래스)가 물려받는 것을 의미한다. 재사용이 용이한 방법이다.

 

스마트폰이라는 부모 클래스가 있다. 전화를 하거나 카카오톡 및 인터넷을 하도록 기능이 구현되어있는데,  화면이 접히거나, 무선 충전도 되는 기능을 추가하고 싶다. 그러면 기존 스마트폰에서 새로운 기능을 탑재한 스마트폰을 생성한다. 그렇다면 본질은 전화를 하고 카톡과 인터넷을 하지만 여러 기능이 갖춰진 스마트폰이 된다.

 

  • 다형성(Polymorphism)

 다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다. 예를 들어보면 스마트폰을 떠올려보자. 스마트폰을 실행시키면 잠금화면, 각종 앱, 게임들이 있을 것이다. 우선 스마트폰 마다 터치로 조작한다 라는 개념은 같다. 하지만 설치된 앱들은 실행 목적과 동작이 다르다. 마인크래프트와 신한은행 어플이 터치로 동작한다와는 개념은 같지만 목적과 방법은 서로 다른것과 같다.

추상화와 다형성

장점 

  • 코드의 재활용성이 높다.
  • 프로그램의 개발과 보수를 간편하게 한다.
  • 직관적으로 분석을 가능하게 한다.

단점

  • 처리속도가 느리다.
  • 지나친 퍼포먼스는 좋은 효과를 보지 못한다.
  • 숙련도가 낮은 경우 매우 복잡한 코드가 된다.

OOP단점: rinae.dev/posts/the-faster-you-unlearn-oop-the-better-for-you-and-your-software-kr

객체 지향과 절차지향

물이 위에서 아래로 흐르는 것처럼, Top-Down방식으로 순차적인 처리가 중요시되며, 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다. 컴퓨터의 처리구조와 유사해 실행속도가 빠르다. 유지보수가 어렵고, 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다.

 

자바스크립트, 객체지향적인 다양한 패턴

ES6에서 class키워드가 나오기 전, 자바스크립트를 객체지향적으로 사용하기 위한 여러 시도가 있었다. 

 

1. Functional 방식

인스턴스를 생성할 때마다 모든 메소드를  someCharging에 할당하기 때문에 각각 인스턴스들이 메소드의 수만큼 메모리를 차지한다.

var Phone = function() {
  var someCharging = {};
  //Mobile함수가 실행되어 나온 인스턴스의 배터리 초기값은 항상 0이다.
  someCharging.battery = 0;
  //function 내부에 있는 this는 someInstance를 뜻한다.
  someCharging.charge = function() {
      this.battery += 10;
  }

  return someCharging ;
}

var Iphone = Phone();
var Galaxy = Phone();
Iphone.charge(); // 10

 

2. Functional Shared 방식

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

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

var methods = {};
  methods.play = function() {
     this.application += 1;
 };

 var Phone2 = function(p) {
     let instance = {
         application: p
     };
     
  extend(instance, methods);
  return instance;
 };

 

3. Prototypal 방식

 var delivery= {};
  delivery.move = function() {
     this.location += 1;
 };

 let fedex = function(p) {
     let deliveryInstance = Object.create(delivery);
    deliveryInstance.position = p
    return deliveryInstance;
 };

 

4. Pseudoclassical 방식

가장 많이 쓰이는 방식이고, 새 인스턴스에 담아주기 위해선 new 연산자를 사용해야한다.

 var Fifa = function(p) {
     this.position = p;
 };

 Fifa.prototype.move = function() {
     this.position += 1;
 };
 
 var player1 = new Fifa(5);
 var player2 = new Fifa(2);

 

ES-6

ES6가 나오게 되면서 변수 선언에 const와 let이 생기게 되었고, 또한 이전에 없던 Class가 추가되었다.

 

Encapsulation