class란 물건을 만드는 설명서라고 할 수 있다.
class 안에서 함수를 만들 땐 function을 사용하지 않고 적는다.
그럼 직접 작성해보자.
class Monster{
power = 10//변수 선언
speed = 25
name = "aa1"
constructor(speed, power, name){ //인스턴스를 생성하고 초기화하기 위한 메서드로 생성자라고 부른다.
this.speed = speed
this.power = power
this.name = name
}
//prototype 메소드
attack(){
console.log(`${this.name}이 ${this.power}의 힘으로 공격합니다`)
}
run(){
console.log(`${this.name}이 ${this.speed}의 속도로 도망칩니다`)
}
}
const mymonster1 = new Monster(50, 200, "zero")//몬스터 클래스의 인스턴스를 만든다.
mymonster1.attack()//공격하자 => prototype chain으로 연결해서 사용!
mymonster1.run()//도망가자
이때 constructor안에서 return을 하면 안 된다!
명시적으로 this가 아닌 다른 값을 반환하는 것은 클래스의 기본동작을 훼손하므로 반드시 return문을 생략해야한다.
class Person {
constructor(name){
this.name = name
return {}
}
}
const me = new Person('Lee')
console.log(me)// {}
//명시적으로 객체를 반환하면 암묵적인 this반환이 무시됨,
class Person {
constructor(name){
this.name = name
return 300
}
}
const me = new Person('Lee')
console.log(me)// 'Lee'
//명시적으로 원시값을 반환하면 암묵적으로 this가 반환된다.
클래스 함수는 다른 클래스의 변수나 함수를 이용할 수 있다는 장점이 있다. 이를 extends를 통해 확장하고, super로 super클래스의 변수나 함수를 가져와보자.
//super class
class Base{
constructor(a, b){
this.a = a
this.b = b
}
}
// sub class
class Derived extends Base{
constructor(a,b,c){
super(a, b)
this.c = c
}
}
const derived = new Derived(1,2,3)
console.log(derived)
//Derived {
// a: 1,
// b: 2,
// c: 3,
// __proto__: { constructor: ƒ Derived() }
//}
이때 서브 클래스의 constructor 안에서 this구문을 통한 재할당을 super보다 먼저 쓰면 에러가 난다.
왜냐하면 서브클래스는 자신이 직접 인스턴스를 생성하지 않고 수퍼 클래스에게 인스턴스 생성을 위임하기 때문이다.
서브 클래스가 new연산자와 함께 호출되면 그 안의 super키워드가 함수처럼 호출된다. 그러면 super클래스의 constructor가 호출이 되므로 그 전에 this를 사용해 만들게 되면 생성이 되지 않는 것이다.
//날짜 내장 객체를 이용해서 클래스 사용
const aaa = new Date()
console.log(aaa.getFullYear())//2022
console.log(aaa.getMonth() + 1)//3
객체지향은 인간의 입장에서 객체를 설계하고 데이터를 처리하는 프로그래밍 패러다임이다.
이러한 OOP의 장점은
단점은
이외에도 많은 특징이 있는데 잘 정리한 블로그가 있어 링크를 건다.
아래처럼 객체 사용을 지향하는 프로그래밍을 말한다.
Model-View-Controller로 역할을 나누어 개발하는 방식으로 비지니스 처리 로지고가 사용자 인터페이스 요소들을 분리시켜 서로 영향없이 개발하는데 좋다.
이때 Model은 우리의 api가 무엇을 할지 정의하며 내부 비즈니스 로직을 처리하기 윈한 역할을 한다.
controller가 model 호출 시 DB와 연동하여 입출력 데이터 처리와 비지느스 로직을 처리한다.
클라이언트가 직접적으로 보는 페이지이며 프론트엔드에서 주로 담당한다.
앞선 2가지를 중간에서 제어한다고 보면된다. 이 안의 service에서 다양한 다양한 데이터 처리 알고리즘을 구현한다.