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
300x250
728x90
'Programming > JavaScript' 카테고리의 다른 글
모던 자바스크립트 (에러핸들링) 8-1. try catch (0) | 2022.04.23 |
---|---|
모던 자바스크립트 (클래스) 7-3. 내장 클래스 확장하기 / instanceof 로 클래스 확인 하기 / 믹스인 (0) | 2022.04.23 |
모던 자바스크립트 (클래스) 7-1. 클래스 기본 문법 / 클래스 상속 (0) | 2022.04.23 |
모던 자바스크립트 (프로토타입과 프로토타입 상속) 6-2. 내장 객체의 프로토타입 / 프로토타입 메서드와 __proto__가 없는 객체 (0) | 2022.04.23 |
모던 자바스크립트 (프로토타입과 프로토타입 상속) 6-1. 프로토타입 상속 / 함수의 prototype 프로퍼티 (0) | 2022.04.23 |