객체지향언어

객체(object)란?

상태와 행동을 구분 지을 수 있는 것.

비유

  1. League of Legends 게임을 만든다고 가정
    1. 중립 몬스터
    2. 잡았을때에 대한 보상이 있다.
    3. 특정한 시간이 되면 나온다 / 죽인 뒤에 몇초 뒤에 나옴
    4. 공격력, 방어력, 체력

아래와 같은 function 객체를 만들기 위한 틀로써 사용된 경우다.

위와 같은 항목을 객체로써 구현함.

function CommonMonster(name, HP, strength, defenceStat, spawnDelay, spawnTime) {
	this.name = name;
	this.HP = HP;
	this.strength = strength;
	this.defenceStat = defenceStat;
	// 몬스터가 다시 스폰되는 딜레이
	this.spawnDelay = spawnDelay;
	// 몬스터가 나오는 시간
	this.spawnTime = spawnTime;
	this.isLive = false;

	function attack() {
		return this.strength * 5;
	}	

	function defence(damage) {
		this.HP -= (damage * ((100 - this.defenceStat) / 100));
		if (this.HP <= 0) {
      this.isLive = false;
		}
	}

	function spawn() {
		this.isLive = true;
	}
}

바론, 용 등 정글 몬스터들을 하나하나 일일히 구현하기 어렵기도 하고 비효율적임.

객체지향언어에서는 commonMonster 와 같은 프레임/틀을 만들어서 중립 몬스터를 보다 쉽게 구현할 수 있음. 좀 더 쉽게 설명하자면 붕어빵을 떠올리면 된다. 붕어빵에도 슈크림붕어빵, 팥붕어빵 여러가지가 있는데 같은 틀을 실제로 사용한다. 이와 같은 이치라고 생각하면 된다.

// 이로써 우리는 CommonMonster 라는 function 을 통해서 틀을 만든 것임.
// 그 틀을 이용해서 우리는 아래와 같은 중립몬스터를 보다 편하게 만들 수 있음.
var dragon = new CommonMonster('드래곤', 2000, 500, 500, 600, 300);
var varon = new CommonMonster('바론', 5000, 1000, 1000, 600, 300);
var chicken = new CommonMonster('닭', 50, 50, 50, 60, 90);

chicken.spawn();

결론

객체지향-프로그래밍(OOP, Object Oriented Programming)는 마치 블럭을 여러개 조합하는 프로그래밍 방식이다. 만약의 League of Legends 라는 게임을 OOP 를 통해서 만든다고 가정했을 때, 모든 것을 객체 단위로 생각해야 한다. 우리는 기본적으로 아래와 같은 단위로 생각할 수 있다.

  1. 구조물 (공격력, 체력, 공격여부, 크기)
  2. 챔피언(공격력, 방어력, 스킬, 이름, 체력, 기력, 마나)
  3. 중립 몬스터(위 참고)

이런식으로 모든 것을 한 단위로 묶고 공통적으로 틀을 만들고 그 틀 조합하고 이용해서 프로그래밍하는 방식이 바로 객체지향 프로그래밍이다. 즉 객체지향언어라는 것은 언어 자체가 객체지향적으로 프로그래밍하는 것을 지향하는 언어라는 것이다. 한마디로 객체지향언어를 사용하더라도 객체지향 프로그래밍을 안하고 프로그래밍 할 수 있다. 하지만 자바스크립트는 객체지향 프로그래밍을 하기 좋게 안성맞춤이고 그것을 지향도록 만들어진 프로그래밍 언어라는 것이다.

객체지향을 제대로 이해하지 못한 상태에서 객체 지향 언어를 사용하면 객체지향언어를 사용하는 의미가 없다. 즉 다른언어를 사용하는 것이랑 다를바가 없고 자바스크립트를 사용하는 의미가 없다는 것. 즉 언어의 이해와 장점을 제대로 활용하지 못하고 있다는 것과 다름이 없다.