본문 바로가기
Develop/Others

static 멤버 언제 어떻게 사용해야 좋을까?

by 3-stack 2022. 2. 14.

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 멤버를 사용할 경우, 객체 지향 설계가 망가질 수 있습니다. 프로그램 설계가 실패하고 정적/절차 지향 프로그래밍을 하게 될 수 있습니다. 이로 인해 메모리 오버플로우가 발생할 수 있습니다.

 

# 주의점

정적 변수는 스레드를 사용할 경우 안전하지 않아, 스레드 환경에서는 예측할 수 없는 이상한 결과가 나타날 수 있다. 정적인 값만 읽는 경우 스레드를 사용하는 것이 좋다.

 

http://spiroprojects.com/blog/cat-view-more.php?blogname=Benefits-of-using-static-method&id=407

댓글