야스오가 있다.
또 야스오를 물려받아 어둠의 인도자 야스오가 있다.
야스오의 스킨은 어둠의 야스오 말고도 여러가지가 있는데,
만약 이를 프로그래밍 한다고 하면
야스오라는 챔피언을 만들고 그 이후 출시하기 위해
새로운 야스오를 선언하고 안에 스킬이펙트등을 조정할것이다.
만약 각 스킨별로 야스오를 새롭게 만든다면 상당한 수고가 들것이고, 그 스킨만 발생하는 버그가 있을것이다.
이를 줄여주고 편리하게 야스오의 틀에서 벗어나지 않도록
하는 패턴이 객체지향 프로그래밍이다.
이렇게 되면 원본야스오는 어떻게 부를까?
클래스 라고 부른다.
class 야스오 {
contructor(스킨이름,색상){
this.스킨이름 = 스킨이름;
this.색상 = 색상;
}
찌르기 () {
console.log(`${this.색상}으로 바뀜`)
}
장막 () {
console.log(`${this.색상}으로 바뀜`)
}
돌진 () {
console.log(`${this.색상}으로 바뀜`)
}
}
let 어둠의인도자야스오 = new 야스오("어둠의인도자야스오","주황");
대략적으로 코드로 표현하면 이렇다.
코드 그대로 class로 야스오라는 설계도를 만들고,
어둠의인도자야스오를 만들기위해 선언 후 new 야스오를 만들어냈다.
이 결과 어둠의인도자야스오는 인스턴스 라고 부른다.
만약 또 스킨을 만들고자하면,
let 하이눈야스오 = new 야스오("하이눈야스오");
야스오라는 클래스를 만듦으로써 스킨을 만들기위한 인스턴스를 찍어낼수 있게되었다.
코드를 보면 class내부에 constructor와 추후 인스턴스를 만들기 위해 new를 선언한것이 보일것이다.
생성자(constructor)는 new를 선언하고 인스턴스가 생성되면 바로 실행되는 함수이다.
class 야스오 {
contructor(스킨이름,색상){
this.스킨이름 = 스킨이름;
this.색상 = 색상;
}
찌르기 () {
console.log(`${this.색상}으로 바뀜`)
}
장막 () {
console.log(`${this.색상}으로 바뀜`)
}
돌진 () {
console.log(`${this.색상}으로 바뀜`)
}
}
let 어둠의인도자야스오 = new 야스오("어둠의인도자야스오","주황");
다시 코드를 보면 생성자에서 함수 인자를 만들고 이를 내부에 this.스킨이름 = 스킨이름;
이렇게 선언했다.
여기서 this.스킨이름
은 추후 만들어질 인스터스의 속성
을 칭하고, 스킨이름
은 인자를 불러와서 값으로 사용한것이다.
메서드는 어떤것일까?
어둠의인도자야스오는 색상변경을 하지만 스킬자체의 매커니즘은 동일하다. 하지만 스킬의 이펙트변화는 스킨별로 다르다.
일단 새로운 인스턴스(어둠야스오)에도 동일한 스킬을 부여한다. 이를 메서드
라고 한다.
지금까지 쓴 코드는 사실 es6에서부터 사용할수 있는 코드다.
ES5 버전으로 코드를 변경해보면
function 야스오(스킨이름,색상) {
this.스킨이름 = 스킨이름;
this.색상 = 색상;
}
야스오.prototype.찌르기 = function () {
console.log(`${this.색상}으로 바뀜`)
}
야스오.prototype.장막 = function () {
console.log(`${this.색상}으로 바뀜`)
}
야스오.prototype.돌진 = function () {
console.log(`${this.색상}으로 바뀜`)
}
var 어둠의인도자야스오 = new 야스오("어둠의인도자야스오","주황");
이처럼 생성자함수 따로, 메서드따로 작성해야한다.
코드의 가독성이나 정리에도 class가 더 유리해보인다.
여기서 es5선언시 prototype을 사용했는데 아직 잘 이해가 되지 않아 공부가 더 필요하다.
아주 예전 프로그래밍은 절차적으로 작성되었다고 한다.
하지만 이는 코드의 양이 방대해지고 관리가 어려워졌다.
이를 해결하기위해 객체지향이 생겨났다.
위의 속성과 메서드를 class야스오 라는 한 묶음으로 만든것처럼 말이다.
또한 객체지향은 4가지 핵심개념을 갖고있다.