- static
- private
- try / catch
1) static
class Human {
name
kor
eng
constructor({ name, kor, eng }) {
this.name = name
this.kor = kor
this.eng = eng
}
static sum(...obj) {
return obj.reduce((acc, curr) => acc + (curr.kor + curr.eng), 0)
}
}
const arr = [
new Human({ name: '김', kor: 80, eng: 90 }),
new Human({ name: '이', kor: 100, eng: 50 })
]
console.log(Human.sum(arr[0], arr[1]));
320
static은 정적 메소드이다.
클래스에서 직접 값을 넘기고 가져올 수 있다.
class MyClass {
count = 0;
constructor(name){
this.name = name
}
// 증가
increment(){
this.count = this.count + 1
}
// 감소
decrement(){
this.count = this.count - 1
}
show(){
console.log(this.count);
}
}
const m1 = new MyClass('최');
m1.increment();
m1.show();
m1.name = '박';
m1.increment();
m1.show();
m1.name = '이';
m1.increment();
m1.show();
1
2
3
class MyClass {
static count = 0;
constructor(name){
this.name = name
}
// 증가
increment(){
MyClass.count ++
}
// 감소
decrement(){
MyClass.count --
}
show(){
console.log(MyClass.count);
}
}
const m1 = new MyClass('최');
m1.increment();
m1.show();
m1.name = '박';
m1.increment();
m1.show();
m1.name = '이';
m1.decrement();
m1.show();
1
2
1
2) private
private는 변수, 메소드의 정보를 은닉할 때 사용한다.
class My {
x = 10
y = 20
#z = 30
static #abc(){
console.log('비공개');
}
run(){
this.#z = 300
return console.log(this.#z)
}
}
const m1 = new My()
console.log(m1);
My { x: 10, y: 20 }
z 변수 앞에 #을 추가했으므로 출력되지 않는다.
class My {
x = 10
y = 20
#z = 30
static #abc(){
console.log('비공개');
}
run(){
this.#z = 300
return console.log(this.#z)
}
}
const m1 = new My()
console.log(m1);
m1.x = 100
m1.y = 200
m1.#z = 300
console.log(m1);
m1.#z = 300
^
SyntaxError: Private field '#z' must be declared in an enclosing class
그러므로 밖에서 값을 변경해 줄 수도 없다.
아래와 같이 메서드도 마찬가지이다.
class My {
x = 10
y = 20
#z = 30 // 변수 앞에 # 추가
static #abc(){
console.log('비공개');
}
run(){
this.#z = 300
return console.log(this.#z)
}
}
const m1 = new My()
m1.run();
My.#abc();
My.#abc();
^
SyntaxError: Private field '#abc' must be declared in an enclosing class
class MyClass {
#num = 200
#data1(){
console.log(this.#num);
}
data2(){
this.#data1()
}
}
const m1 = new MyClass()
m1.data2();
200
하지만 공개되어있는 메서드에 값을 넣게되면 출력이 가능하다.
3) try / catch
const abc = () =>{
console.log('HELLO');
}
try {
// 실행값
abc()
ab()
} catch(e){
// 에러 발생
console.log(e);
console.log();
console.log(e.name);
console.log(e.message);
console.log('error 발생');
}
HELLO
ReferenceError: ab is not defined
at Module._compile (node:internal/modules/cjs/loader:1254:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
at Module.load (node:internal/modules/cjs/loader:1117:32)
at Module._load (node:internal/modules/cjs/loader:958:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
ReferenceError
ab is not defined
error 발생
try catch문은 try를 실행한 뒤 에러가 발생할 경우 어떻게 출력할 지를 정할 수 있다.
위 코드에선 ab()함수가 없으므로 에러가 발생하였다.
let x = '';
try {
if(x==='') throw '빈값'
let y = x + 100;
console.log(y);
} catch(err){
console.log(`에러 ${err}`);
} finally {
console.log(`finally`);
}
에러 빈값
finally
finally는 실행이 됐을 때와 에러가 발생했을 때 모두 실행된다.