1. 클래스?
C언어를 제외한 대부분의 프로그래밍 언어는 객체지향 패러다임을 기반으로 만들어 졌다.
객체지향이란 말 그대로 객체를 우선적으로 생각해서 프로그램을 만든다는 방법론이다.
객체지향 말고 다른게 뭐가 있냐? 라는 생각도 들법한데, 바로 절차 지향이다.
이 두가지는 어떻게 다른가??
절차지향은 턴제 시뮬레이션 게임이다.
순서가 정해져 있고, 그 순서가 끝나기 전에 다른 이들이 행동할 수 없다.
객체지향은
자, 여기 프로브와 드론이 영혼의 대결을 펼치고 있다.
프로브와 드론의 체력은 20으로 하고 각각 5의 공격력을 가지고 있으며 프로브가 선공을 가진다라고 정의해보자
이걸 절차지향으로 나타내면 다음과 같다.
프로브와 드론의 대결! 프로브 체력 20! 공격력 5!
드론 체력 20! 공격력 5!
프로브의 선공! 드론의 남은체력 15!
드론의 반격! 프로브의 남은체력 15!
프로브의 공격! 드론의 남은체력 10!
드론의 공격! 프로브의 남은체력 10!
프로브의 공격! 드론의 남은체력 5!
드론의 공격! 프로브의 남은체력 5!
프로브의 선공! 드론의 남은체력 0!
프로브가 승리했다!
그럼 이걸 객체지향으로 표현한다면??
우리가 스타크래프트로 두 유닛을 붙여놓은거랑 비슷하다.
선공의 개념을 정해줄 필요가 없으며
각 객체가 서로 독립적이고 따로 행동하며
프로브와 드론은 굳이 순서에 얽매이지 않고 유기적으로 행동할 수 있다.
2. 추상화?
위의 프로브를 보자,
실제로, 프로브는 체력 20, 보호막 20, 공격력 5, 방어력 0, 크기는 소형 이라는 요소를 가진 객체다.
만약 프로브가 실제로 존재한다면 요소는 이게 끝이 아닐 것이다.
아마 질량과 중량, 재질, 각 부분별 길이부터 구성하고 있는 원소의 종류와 수와 상태까지,
열거하자면 그야말로 끝도 없을 것이다.
하지만 게임에서 구현할 때는 이런건 전부 필요 없다.
즉, 필요한 요소만 가지고 객체를 표현한 것이 바로 추상화라고 할 수 있다.
프로토스에겐 프로브만 있는 것이 아니다.
위와 같이 다양한 유닛이 있다.
이것들을 관리하기 위해서 필요한 공통사항을 추출하는데 이를 추상화라고 한다.
공통사항으론 다양한 것이 존재한다.
체력, 방어력, 타입, 속성, 공격여부, 지상유닛인지 공중유닛인지에 대한 구분, 건물인지 아닌지에 대한 구분 등이 있을 것이다.
이를 코드로 작성해보면 얼추 이렇게 나온다.
const unit []
unit.push({이름: 프로브, 공격력: 5, 방어력: 0, 체력 20, 보호막: 20})
unit.push({이름: 질럿, 공격력: 16, 방어력: 1, 체력 100, 보호막: 60})
unit.push({이름: 드라군, 공격력: 20, 방어력: 1, 체력 100, 보호막: 80})
이하 생략...
우리는 이러한 데이터를 가지고 입맛에 맞게 조리할 수 있다.
공격력부터 보호막까지 더한 수치를 전투력이라고 정의해보자
for (const p of unit){
const sum = p.공격력 + p.방어력 + p.체력 + p.보호막
output = sum
}
console.log(output)
이걸 실행하면 각 수치를 더한 값을 얻을 수 있다.
물론 단순히 더하는 것 뿐만 아니라 지금까지 배운 것을 종합하면
3. 클래스 선언
다시 클래스로 넘어와보자
클래스를 선언해보자
class 클래스의 이름{
}
'클래스의 이름'이라는 클래스를 만들었고 이것을 복사해보자
new 클래스의 이름
자, 클래스의 이름의 인스턴스를 만들었다.
이게 뭔 내용인가 이해하기 힘들 수 있는데, 아까 그 프로브를 인용하면 다음 같다.
자, 맵상에 여러마리의 프로브가 있다.
이 프로브들은 처음 생산될때는 서로 같은 값을 가지지만 이게 항상 동일하지는 않다.
누군가는 공격을 당했을 것이고
누군가는 방어력 업그래이드를 했을 것이다.
즉, 클래스란 기초가 되어주는 원본이고
인스턴스란 그 원본을 복사해낸 것이다.
인스턴스가 가지고 있는 값이 변하여도 클래스가 가진 값은 변하지 않는다.
수많은 프로브들 가운데 누가 두들겨 맞았다고 해서
앞으로 생산될 다른 프로브들 까지 두들겨 맞은체로 태어나지는 않을태니 말이다.
하지만 클래스가 바뀌어버린다면
이후로 생성될 인스턴스의 값들도 바뀌어버린다.
원본이 수정되었으니 그 이후에 만들어진 사본들도 바뀐체로 태어나는 것이다.
4. 생성자
클래스 안에 새로운 것을 만들어주는 역할을 한다.
class Unit {
constructor(이름, 공격, 방어, 체력){
this.이름 = 이름
this.공격 = 공격
this.방어 = 방어
this.체력 = 체력
}
}
const unit = []
unit.push(new Unit('신캐A', 16, 2, 20))
unit.push(new Unit('신캐B', 216, 12, 4120))
unit.push(new Unit('신캐C', 600, 2, 20000))
만약에 스타크래프트에 새로운 유닛이 생성된다고 가정해보자
설령 새로운 유닛이라 할지라도 기존의 유닛들과 공통점이 있을 것이다.
(예를 들면, 위 처럼 이름을 가지고 있다던지 체력을 가지고 있다던지/)
그 공통점을 바탕으로 새로운 유닛을 만들고 정의할 수 있다.
그 역할을 해주는 것이 바로 생성자라고 할 수 있다.
5. 메소드
클래스 안에 함수를 추가해주는 것이라 할 수 있다.
예를들어, 신캐릭터의 가격이 그 캐릭터의 모든 스텟을 합친것과 같다고 가정해보자
class Unit {
constructor(이름, 공격, 방어, 체력){
this.이름 = 이름
this.공격 = 공격
this.방어 = 방어
this.체력 = 체력
}
price() {
return this.공격 + this.방어 + this체력
}
}
const unit = []
unit.push(new Unit('신캐A', 16, 2, 20))
unit.push(new Unit('신캐B', 216, 12, 4120))
unit.push(new Unit('신캐C', 600, 2, 20000))
이렇게 하면 새로 정의한 신캐 A,B,C의 가격은 각각 38, 4348, 20602가 될 것이다.
여기서 가격을 계산해준 price()가 메소드가 된다.
'Language > JavaScript' 카테고리의 다른 글
JavaScript 공부정리 - 클래스 - 게터와 세터 (1) | 2022.10.24 |
---|---|
JavaScript 공부정리 - 프리티어 (0) | 2022.10.14 |
JavaScript 공부정리 - 예외처리 (1) | 2022.10.13 |
JavaScript 공부정리 - 호이스팅 (0) | 2022.10.07 |
JavaScript 공부정리 - 클래스 (0) | 2022.10.07 |