: 정수인지 아닌지 판단하고 boolean 값을 출력
: 정수인 경우 true, 정수가 아닌 경우 false
: 제곱근 구하는 매서드
: 거듭제곱 계산 가능
: 첫번째 매개변수는 제곱 계산할 숫자, 두번째 매개변수는 얼마나 거듭해서 제곱할건지 입력
: 제곱의 경우 더 간편하게 계산 가능 ex) 3**2 = 3의 제곱
: 검색 조건을 주고 조건을 충족하는 값만 출력 가능
객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀로, 객체를 정의하기 위한 상태(멤버 변수)와 메서드(함수)로 구성된다.
쉽게 말해 물건 만드는 설명서라고 이해하면 된다.
실무에선 동일한 종류의 객체를 여러 개 생성해야 하는 경우에 클래스를 사용!
컴포넌트 (부품) 역시 클래스로 만들 수 있다.
Class 내
함수 선언시 function 작성 X => 매서드처럼 사용가능
변수 선언시 선언 키워드 작성 X
// index.js
class Monster {
power = 10
attack = () => {
console.log("공격하자!!")
}
run = () => {
console.log("도망가자!!")
}
}
const mymonster1 = new Monster()
mymonster1.attack()
mymonster1.run()
const mymonster2 = new Monster()
mymonster2.attack()
mymonster2.run()
new연산자와 생성자 함수를 사용해서 새로운 객체(mymonster1,2)를 생성
새로운 객체를 instance라고도 함
(+) const date = new Date()에서 Date()는 내장객체 / date는 객체
date instanceof Date // true 반환
class 내부 의 어떠한 함수 안에 또 다른 함수를 실행시키고자 할 때, 또는 어떠한 함수 안에서 변수의 값을 가지고 와야 할 때 this를 사용하면 된다.
클래스내 함수와 변수 키워드 생략되는 대신 this.가 생략되어 있다고 생각하면 됨
this는 클래스를 의미함!
또한 power의 값과 같이 초기값을 다르게 주고 싶을 때는 class를 여러개를 만들어도 되지만, 비효율적이기 때문에 인수를 사용하여 아래와 같이 정의할 수도 있음!
// index.js
class Monster {
power = 10;
constructor(qqq) {
this.power = qqq;
}
attack = () => {
console.log("공격하자!!");
console.log("내 공격력은 " + this.power + "야!!!");
};
run = () => {
console.log("도망가자!!");
};
}
const mymonster1 = new Monster(20);
mymonster1.attack();
mymonster1.run();
const mymonster2 = new Monster(50);
mymonster2.attack();
mymonster2.run();
내장되어 있는 생성자 함수 Constructor()
: 얘는 처음 함수가 실행될 때 만들어지는 함수 = 초기값을 생성해 줄 수 있음
: 즉 해당 클래스를 생성할 때(mymonster1,2) 실행해주는 함수
: mymonster로부터 넘겨받은 인수와 함께 constructor가 자동으로 실행됨
: 위의 예에서 인수 20과 50이 qqq라는 이름으로 this.power에 할당해 줌으로써 초기감이 다시 생성되는 것이다
결국 쉽게 말해 객체를 사용해서 프로그래밍 하는 것이다!
앞에서 살펴본 클래스를 이용한 방법도 일종의 객체지향 프로그래밍이다.
캡슐화란 하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것을 의미
상속이란 기존 상위 클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념
다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다. 즉, 다형성은 형태가 같은데 다른 기능을 하고 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
오버라이딩(Overriding)
오버로딩(Overloading)
클래스 상속 개념!
누군가로부터 해당 기능을 상속받는 것
같은 기능들을 사용할 때는 코드의 효율성을 높이기 위해 중복되는 코드들을 최소화
상속받은 기능 중 겹치는 것이 있으면 나중에 선언된 기능만 구현되고 이전의 것은 없는 것으로 간주되는데 이를 오버라이딩이라 한다. 다시 말해 부모의 기능을 덮어쓴다는 뜻이다.
// index.js
class Monster {
power = 10
constructor(qqq){
this.power = qqq
}
attack = () => {
console.log("공격하자!!")
console.log("내 공격력은 " + this.power + "야!!!")
}
}
class 공중몬스터 extends Monster {
constructor(aaa){
super(aaa)
}
run = () => {
console.log("날라서 도망가자!!")
}
}
class 지상몬스터 extends Monster {
constructor(bbb){
super(bbb)
}
run = () => {
console.log("뛰어서 도망가자!!")
}
}
const mymonster1 = new 공중몬스터(20)
mymonster1.attack()
mymonster1.run()
const mymonster2 = new 지상몬스터(50)
mymonster2.attack()
mymonster2.run()
extends
를 통해서 공중몬스터와 지상몬스터에 상속해 줌으로써 사용 가능!super
: 생성자 constructor는 공중몬스터와 지상몬스터에서 동일하게 사용할 수 있지만, 현재 power 변수는 상속해 준 Monster 내부에 존재하므로, Monster class 내부에 있는 constructor로 인수를 넘겨 주기 위해 사용상속받은 경우 초기값(생성자)을 해당 자식한테 초기값(생성자)으로 먼저 넘기고 그 값을 부모(생성자)한테 다시 넘긴다로 이해하자!
constructor( ){ super( ) }
전략패턴 (Strategy Pattern)
: 전략패턴은 이미 완성된 상태에서 안의 부품만 갈아끼우는 것 (부품교환느낌)
예를 들면, 로그인 제품 (기능) 하나 만들어놓고 그 안의 부품을 카카오로그인, 네이버로그인 등 부품만 갈아끼우는 것! 유지보수에 용이하고 매우 효율적이다
: 부품 4개
: 이에 반해 상속은 로그인 기능을 각각 하나씩 만들어냐하니 최종제품 (기능)이 4개가 됨
: 상속 = 기능확장 / 전략패턴 = 부품교환
// index.js
class 공중부품 {
run = () => {
console.log("날라서 도망가자!!")
}
}
class 지상부품 {
run = () => {
console.log("뛰어서 도망가자!!")
}
}
class Monster {
power = 10
qqq;
constructor(부품){
this.qqq = 부품
}
attack = () => {
console.log("공격하자!!")
console.log("내 공격력은 " + this.power + "야!!!")
}
run = () => {
this.qqq.run()
}
}
const mymonster1 = new Monster(new 공중부품())
mymonster1.attack()
mymonster1.run()
const mymonster2 = new Monster(new 지상부품())
mymonster2.attack()
mymonster2.run()
new Monster
를 통해 몬스터를 만들 때, 부품(부품 Class)으로 존재하는 공중 부품(new 공중부품()
)과 지상 부품(new 지상부품()
)을 각각 넣어주고 디자인 패턴이란 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여 특정한 "규약"을 통해 쉽게 쓸 수 있는 형태 로 만든 것
MVC 는 Model, View, Controller의 약자로써 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴이다.
controllers
에서는 미들웨어 함수를 분리해서 관리 (쉽게 말해 API)
models
에서는 DB 생성을 관리해주는 곳으로 이전에 배운 Schema 정의를 해 준 폴더와 동일
view
에는 화면에 보여지는 파일들(html 파일)을 관리해주는 폴더
위의 그림처럼 사용자가 controller를 조작하면 controller는 model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다!
그럼 왜 MVC 패턴을 사용할까?
사용자가 보는 페이지, 데이터처리, 그리고 이 2가지를 중간에서 제어하는 컨트롤, 이 3가지로 구성되는 하나의 애플리케이션을 만들면 각각 맡은 바에만 집중을 할 수 있다.
이는 바로 효율성으로 직결되기 때문에 사용한다.
마치 공장에서의 분업과도 같은 개념.서로 분리되어 각자의 역할에 집중해 개발한다면, 유지보수성, 애플리케이션의 확장성, 그리고 유연성이 증가 하고, 중복코딩이라는 문제점 또한 사라지게 될 것 이다!
MVP 패턴을 이용해 controller 구성시 중요사항!
1 . route경로(기능별)에 따른 controller를 작성
2 . endPoint 별로 분리하여 controller를 작성
3 . service 부분이 API 핵심 기능을 다 담고 있다고 보면 됨
결국 service -> controller -> index 순으로 층이 생기게 되는데 이와 같은 구조를 Layered architecture 라고 한다
이러한 구조가 유지 / 보수에 용이하고 앞으로 배울 nestjs의 기본구조도 위와 동일하다.