타입스크립트-static 고정변수와 싱글톤패턴

Array.prototype·2022년 12월 3일
0

타입스크립트

목록 보기
4/4

필요성

클래스의 각 인스턴스가 일부 프로퍼티를 공유해야하는 상황에서 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가 동일한 인스턴스를 사용하여 동일한 결과값을 얻었다.

profile
frontend developer

0개의 댓글