FrontEnd/Vanilla JS

[JS]객체지향 프로그래밍 과 생성자

펭긴킴 2024. 3. 5. 21:31

객체지향 프로그래밍 ?

  • 프로그래밍의 방법론 중 하나.
  • 구체적인 사물을 추상화하여 표현 => 최소한의 정보로 대상을 표현
  • 객체를 만들어 서로 소통 할수있게 코드를 작성.
  • 객체지향의 장점 
    • 모듈성: 각 객체마다 독립적인 기능과 데이터를 가짐 => 재사용률이 높아진다.
    • 재사용성: 다른 프로그램에서  재사용과 확장기능을 넣어 사용 할 수 있음.
    • 확장성: 기존 객체를 수정하지 않고 기능 확장
    • 유지보수성: 각객체가 독립적으로 작동, 코드의 중복이 적기 때문에 유지 보수하기가 편하다.
    • 직관성: 사물을 객체로 모델링하여 데이터와 메서드를 가지고 있음 > 구조 이해가 직관적이다.
    • 캡슐화: 데이터와 메서드를 하나의 단위로 묶어 객체의 세부 구현내용을 숨긴다.

 

1. 추상화 해보기

    const bank = [
      {
        name:'펭귄은행',
        account: 100,
        vipAccount: 6,
        allAccount: function allAccount(){
          console.log(`${this.name} 계좌 수 : ${this.account + this.vipAccount}`);
        }
      }
    ]

 

 

2. 각 다른 객체끼리 상화작용하게 해보기 

   const bank =
    {
      name: '펭귄은행',
      account: 100,
      vipAccount: 6,
      allAccount: function allAccount() {
        console.log(`${this.name} 계좌 수 : ${this.account + this.vipAccount}`);
      },
      makeAccount: function (customer) {
        customer.join();
        console.log(customer);
      }
    }

    const customer = {
      cusAccount: 1,
      join: function () {
        this.cusAccount++;
        // === this.account = account +1;
      }
    }

    bank.makeAccount(customer);
    //cusAccount가 2로 증가함

 

객체와 객체가 서로 메소드를 통해 상호작용 할수가 있다 .

 

 

생성자?

  • new 연산자와 함께사용
const me = new Arrry ('펭귄', '희준', '패캠');
//['펭귄', '희준, '패캠']
//Array 는 JS 의 기본 내장 생성자 이다
  • 생성자를 통해 생성된 객체는 같은 프로퍼티와 매서드를 공유한다.

 

1. 커스텀 생성자 만들기

//function (커스텀생성자 이름)(){}
//Java 의 class 이름과같이 첫문자가 대문자인것이 권고 사항이다
function Bank(){}

2. 프로토타입

  • 객체를 생성하는건 쉽지만, 객체를 생성할때마다 새로운 함수도 같이 생성하게된다
    • 메모리 등 자원낭비가 심해진다.
  • 특정 객체에대한 참조 : 생성자 함스로 인스턴스를 생성하게되면 prototype 을 자동으로 참조하게된다.
    • new 키워드를 통해 생성자 함수의 prototype과 __proto__ 가 연결되어 prototype 을 쓸수있게된다 (상속 받는다.)
const bank = [
      {
        name:'펭귄은행',
        account: 100,
        vipAccount: 6,
        allAccount: function allAccount(){
          console.log(`${this.name} 계좌 수 : ${this.account + this.vipAccount}`);
          //펭귄 은행 계좌수 106
        }
      },
      {
        name:'남극은행',
        account: 200,
        vipAccount: 4,
        allAccount: function allAccount(){
          console.log(`${this.name} 계좌 수 : ${this.account + this.vipAccount}`);
          //남극은행 계좌수 204
        }
      },
      {
        name:'추워은행',
        account: 800,
        vipAccount: 5,
        allAccount: function allAccount(){
          console.log(`${this.name} 계좌 수 :  ${this.account + this.vipAccount}`);
          //추워은행 계좌수 805
        }
      }]

      bank[0].allAccount(); //펭귄 은행 계좌수 106
      bank[1].allAccount(); //남극은행 계좌수 204
      bank[2].allAccount(); //추워은행 계좌수 805

 

이 코드를 커스템 생성자와 프로토 타입을 사용하며 변환시켜보자 

    // 프로토 타입으로 정의 해보기
    // 커스텀 생성자 생성
    // 생성자 함수는 화살표함수 사용불가(class 는가능)

    function Bank(name, account, vipAccount) {
      this.name = name;
      this.account = account;
      this.vipAccount = vipAccount;
    }

    //프로토타입 지정해주기
    Bank.prototype.allAccount = function () {
      console.log(`${this.name} 계좌 수 :  ${this.account + this.vipAccount}`);
    }

    const penBank = new Bank('펭귄은행', 100, 6);
    const souBank = new Bank('남극은행', 200, 4);
    const coldBank = new Bank('추워은행', 800, 5);

    penBank.allAccount();
    souBank.allAccount();
    coldBank.allAccount();