클래스

클래스란

클래스란 객체를 생성하기 위한 템플릿이다.

클래스 이전의 객체 생성

클래스 이전에는 함수로 객체를 생성했다. 함수로 객체를 생성하는 방법으로 공장함수와 생성자 함수가 있다.

공장함수

공장함수는 객체를 반환값을 가지는 것 외에는 일반 함수와 문법이 동일하다.

// factory function(공장함수)
function createMonster(name, hp, att) {
  return {
    name,
    hp,
    att,
    // 객체에 메서드까지 담아서 반환 가능, 공장함수로 객체 생성 시 메서드도 동일하게 새로 생성 됨
    attack(monster) {
      monster.hp -= this.att;
    },
  };
}

공장함수로 생성한 객체가 메서드를 가지기 위해서는 반환 객체에 함수를 포함해야한다. 객체를 생성할 때마다 함수를 새로 생성하는 것은 자원 낭비이므로 공장함수 외부에 객체의 메서드를 선언하는 방법이 있다.

// factory function(공장함수)

function attack(monster) {
  monster.hp -= this.att;
}

function createMonster(name, hp, att) {
  return {
    name,
    hp,
    att,
    attack,
  };
}

생성자함수

생성자함수는 객체의 이름을 본따 함수 이름으로 삼는다. 공장함수와 마찬가지로 메서드가 생성자 함수 밖에서 정의된다.

// constructor function 생성자함수
function Monster(name, hp, att) {
  this.name = name;
  this.hp = hp;
  this.att = att;
}

// 생성자 함수로 생성한 객체 시 메서드 설정법
Monster.prototype.attack = function (monster) {
  monster.hp -= this.att;
};

생성자 함수로 객체 선언 시 new 키워드를 사용한다.

const monster4 = new Monster('슬라임', 45, 1);
const monster5 = new Monster('슬라임', 1, 100);
const monster6 = new Monster('슬라임', 100, 3);

클래스: 함수 이수의 객체 생성법

클래스는 객체와 메서드를 묶어서 관리하기 위한 템플릿이다. 공장함수와 생성자함수와 달리 메서드와 속성을 동일 블록 속에서  함께 정의한다.

class Monster {
  // 생성자 함수
  constructor(name, hp, att) {
    this.name = name;
    this.hp = hp;
    this.att = att;
  }
  // 메서드
  attack(monster) {
    monster.htp -= this.att;
  }
}

상속을 활용하면 기존의 클래스 코드를 재사용하여 새로운 클래스를 만들 수 있다.

class Unit {
  constructor(name, hp, att) {
    this.name = name;
    this.hp = hp;
    this.att = att;
  }
  attack(target) {
    target.hp -= this.att;
  }
}

class Hero extends Unit {
  constructor(name, hp, att) {
    super(name, hp, att);
    this.maxHp = hp;
  }
  attack(target) {
    super.attack(target);
    console.log('추가동작');
  }
  heal() {
    this.hp = this.maxHp;
  }
}

자식클래스는 생성자와 부모의 함수를 사용할 때 super를 사용해야한다.

정리

  • 객체는 함수로 생성하는 방법과 클래스로 생성하는 방법이 있다.
  • 클래스는 객체를 생성하기 위한 템플릿이다.
  • 객체를 함수로 생성하는 방법으로 생성자 함수공장함수가 있다.
  • 객체 생성시 new 키워드를 사용한다.
  • extends를 통해 상속으로 기존의 코드를 재사용하여 클래스를 새로 정의할 수 있다.