클래스의 각 인스턴스가 일부 프로퍼티를 공유해야하는 상황에서 static 키워드를 사용할 수 있다.
class Shooter {
static totalBullet = 100
shoot(){
Shooter.totalBullet--
console.log(Shooter.totalBullet)
}
}
const shooter1 = new Shooter()
const shooter2 = new Shooter()
shooter1.shoot() // 99
shooter2.shoot() // 98
위의 두 인스턴스는 동일한 변수 totalBullet을 공유한다.
그러나 클래스를 상속받은 서브클래스와는 공유하지 않는다.
class Shooter {
static totalBullet = 100
shoot(){
Shooter.totalBullet--
console.log(Shooter.totalBullet)
}
}
const shooter1 = new Shooter()
const shooter2 = new Shooter()
shooter1.shoot()
shooter2.shoot()
class SubShooter extends Shooter {
shoot2(){
SubShooter.totalBullet--
SubShooter.totalBullet--
SubShooter.totalBullet--
console.log(SubShooter.totalBullet);
}
}
const shooter3 = new SubShooter()
shooter3.shoot2() // 위에서 shoot()이 두번 실행되었으므로 98에서 시작하므로 95
shooter1.shoot() // 98
shooter1.shoot() // 96
shooter1.shoot() // 95
shooter1.shoot() // 94
shooter1.shoot() // 93
shooter1.shoot() // 92
shooter1.shoot() // 91
shooter1.shoot() // 90
shooter1.shoot() // 89
shooter1.shoot() // 88
shooter1.shoot() // 87
shooter1.shoot() // 86
shooter1.shoot() // 85
shooter1.shoot() // 84
shooter3.shoot2() // 95 - 3 = 92
Shooter클래스의 인스턴스와 Shooter클래스를 상속받은 클래스의 인스턴스는 서로 공유되지 않는다.
단 하나의 인스턴스를 생성하는 디자인 패턴
new 키워드로 여러개의 인스턴스를 생성할 수 있으므로 new 키워드 사용을 막아야함. static 키워드로 클래스 메서드를 정적메서드로 만들면 인스턴스가 아닌 클래스에 속하도록 만들수가 있음.
class AppState {
counter = 0;
private static instanceRef: AppState // AppStore의 단일 인스턴스에 대한 참조
private constructor(){} // new 연산자 사용 불가하도록 막기
static getInstance(): AppState{
if(AppState.instanceRef === undefined){
AppState.instanceRef = new AppState()
}
return AppState.instanceRef
}
}
// const app = new AppState()
// Constructor of class 'AppState' is private and only accessible within the class declaration.
// a, b가 동일한 인스턴스를 리턴받음.
const a = AppState.getInstance()
const b = AppState.getInstance()
a.counter++
a.counter++
b.counter++
b.counter++
console.log(a.counter); // 4
console.log(b.counter); // 4
private생성자이므로 new키워드로 인스턴스를 생성할 수 없고 AppState클래스에서 제공하는 getInstance()로 클래스의 생성자를 호출할 수 있다. 인스턴스는 AppState.instanceRef하나뿐이므로 a, b가 동일한 인스턴스를 사용하여 동일한 결과값을 얻었다.