320x100
320x100

정적 메서드

: prototype이 아닌 클래스 함수 자체에 메서드를 설정한 것

: 어떤 특정한 객체가 아닌 클래스에 속한 함수를 구현하고자 할 때 주로 사용

class User {
  static staticMethod() {
    alert(this === User);
  }
}

User.staticMethod(); // true
class User { }

User.staticMethod = function() {
  alert(this === User);
};

User.staticMethod(); // true

 

- 생성자를 사용한 구현

class Article {
  constructor(title, date) {
    this.title = title;
    this.date = date;
  }

  static createTodays() {
    // this는 Article입니다.
    return new this("Today's digest", new Date());
  }
}

let article = Article.createTodays();

alert( article.title ); // Today's digest

: 항목 검색, 저장, 삭제 등을 수행하는 DB 관련 클래스에서도 사용

 

 

 

 

정적 프로퍼티

: 일반 클래스 프로퍼티와 유사하나 static이 붙는다는 점이 다름

class Article {
  static publisher = "Ilya Kantor";
}

alert( Article.publisher ); // Ilya Kantor

 

 

 

 

 

정적 프로퍼티와 메서드 상속

class Animal {
  static planet = "지구";

  constructor(name, speed) {
    this.speed = speed;
    this.name = name;
  }

  run(speed = 0) {
    this.speed += speed;
    alert(`${this.name}가 속도 ${this.speed}로 달립니다.`);
  }

  static compare(animalA, animalB) {
    return animalA.speed - animalB.speed;
  }

}

// Animal을 상속받음
class Rabbit extends Animal {
  hide() {
    alert(`${this.name}가 숨었습니다!`);
  }
}

let rabbits = [
  new Rabbit("흰 토끼", 10),
  new Rabbit("검은 토끼", 5)
];

rabbits.sort(Rabbit.compare);

rabbits[0].run(); // 검은 토끼가 속도 5로 달립니다.

alert(Rabbit.planet); // 지구
class Animal {}
class Rabbit extends Animal {}

// 정적 메서드
alert(Rabbit.__proto__ === Animal); // true

// 일반 메서드
alert(Rabbit.prototype.__proto__ === Animal.prototype); // true

 

 

 

 

private / protected 프로퍼티와 메서드

: 객체 지향 프로그래밍의 가장 중요한 원리 중 하나인 내외부 인터페이스를 구분 짓는 방법

 

- 내부 인터페이스 (private)

: 동일한 클래스 내의 다른 메서드에서 접근할 수 있지만 

  클래스 밖에서는 접근할 수 없는 프로퍼티와 메서드

 

- 외부 인터페이스 (public)

: 클래스 밖에서도 접근 가능한 프로퍼티와 메서드

 

 

 

 

 

프로퍼티 보호하기

class CoffeeMachine {
  _waterAmount = 0;

  set waterAmount(value) {
    if (value < 0) throw new Error("물의 양은 음수가 될 수 없습니다.");
    this._waterAmount = value;
  }

  get waterAmount() {
    return this._waterAmount;
  }

  constructor(power) {
    this._power = power;
  }

}

// 커피 머신 생성
let coffeeMachine = new CoffeeMachine(100);

// 물 추가
coffeeMachine.waterAmount = -10; // Error: 물의 양은 음수가 될 수 없습니다.

 

 

 

 

 

읽기전용 프로퍼티

class CoffeeMachine {
  _waterAmount = 0;

  set waterAmount(value) {
    if (value < 0) throw new Error("물의 양은 음수가 될 수 없습니다.");
    this._waterAmount = value;
  }

  get waterAmount() {
    return this._waterAmount;
  }

  constructor(power) {
    this._power = power;
  }

}

// 커피 머신 생성
let coffeeMachine = new CoffeeMachine(100);

// 물 추가
coffeeMachine.waterAmount = -10; // Error: 물의 양은 음수가 될 수 없습니다.
class CoffeeMachine {
  _waterAmount = 0;

  setWaterAmount(value) {
    if (value < 0) throw new Error("물의 양은 음수가 될 수 없습니다.");
    this._waterAmount = value;
  }

  getWaterAmount() {
    return this._waterAmount;
  }
}

new CoffeeMachine().setWaterAmount(100);

 

 

 

 

 

Private 프로퍼티

class CoffeeMachine {

  #waterAmount = 0;

  get waterAmount() {
    return this.#waterAmount;
  }

  set waterAmount(value) {
    if (value < 0) throw new Error("물의 양은 음수가 될 수 없습니다.");
    this.#waterAmount = value;
  }
}

let machine = new CoffeeMachine();

machine.waterAmount = 100;
alert(machine.#waterAmount); // Error


class MegaCoffeeMachine extends CoffeeMachine {
  method() {
    alert( this.#waterAmount ); // Error: CoffeeMachine을 통해서만 접근할 수 있습니다.
  }
}

 

 

 

 

 

 

 

 

Refference

 

정적 메서드와 정적 프로퍼티

 

ko.javascript.info

 

private, protected 프로퍼티와 메서드

 

ko.javascript.info

 

300x250
728x90