express API 서버를 javascript -> typescript로 개편하면서
사용했던 static 메소드에 대해 간단히 알아봤습니다.
import express from "express";
export class AppRouter {
private static instance: express.Router;
static getInstance(): express.Router {
if (!AppRouter.instance) {
AppRouter.instance = express.Router();
}
return AppRouter.instance;
}
}
# 사용하면 좋은 경우
- 코드가 인스턴스 생성에 의존적이지 않고 인스턴스 변수를 사용하지 않는 경우
- 유틸리티와 같이 메서드 정의가 변화되지 않고 재정의 될 경우도 없는 경우
- 특정 코드 조각이 많은 장소에서 공유되는 경우
# 장점
- 편리한 사용 - Math 또는 상수 클래스와 같은 helper class처럼 사용할 수 있습니다. 클래스의 일부이므로 메모리에 상주하므로 객체를 생성할 필요 없이 클래스 이름을 사용하여 호출하여 유용하게 사용할 수 있습니다.
- 객체를 많이 생성하더라도 static 멤버에 의한 메모리 증가는 없습니다.
# 단점
- 가비지 컬렉터가 수집하지 않는다. - static 멤버는 클래스 정의의 일부이므로 애플리케이션이 종료될 때까지 메모리에 남아 있습니다.
- 메모리 오퍼플로우가 발생할 수 있다. - 객체 지향 설계가 망가질 수 있습니다.(캡슐화가 아니기 때문에 본질적으로 객체지향이 아닙니다.) 지나치게 static 멤버를 사용할 경우, 객체 지향 설계가 망가질 수 있습니다. 프로그램 설계가 실패하고 정적/절차 지향 프로그래밍을 하게 될 수 있습니다. 이로 인해 메모리 오버플로우가 발생할 수 있습니다.
# 주의점
정적 변수는 스레드를 사용할 경우 안전하지 않아, 스레드 환경에서는 예측할 수 없는 이상한 결과가 나타날 수 있다. 정적인 값만 읽는 경우 스레드를 사용하는 것이 좋다.
'Develop > Others' 카테고리의 다른 글
Failed to get device handle and/or partition ID (0) | 2022.05.16 |
---|---|
iOS app lacks App ID Prefix. UniversalLinks is not enabled for the app. (1) | 2022.04.09 |
[typescript] Composition vs Inheritance (0) | 2022.02.06 |
[typescript] Interface VS Abstract Class (0) | 2022.02.04 |
check code difference / git diff with vscode (0) | 2022.01.27 |
댓글