static은 무슨 의미일까?

October 31, 2023 (1y ago)

static 은 정확히 뭐하는 친구일까?

내가 알고 있는 static은 class 내에서 static 메소드나 필드를 만든다. 그리고 static으로 정의된 메소드나 필드는 클래스의 인스턴스를 사용하여 직접적으로 접근할 수 없고 class로 접근을 해야 한다는 것이다.

위에 내가 설명해 놓은 부분에서 애매모호하게 알고 있는 것들이 많아서 정확하게 짚고 가보려고 한다.

static 의 의미는 무엇인가?

이를 알기 위해서는 동적과 정적을 떠올려보면 된다. 동적인 것은 무엇일까? 동적인것은 시시각각 변화하고 있는 것을 동적이라고 표현한다? 동물을 보면 한 볼때마다 자세가 바뀌어 있는 것과 같은 맥락이다. 그렇다면 정적인 것은 무엇일까? 변하지 않고 고정되어 있는것이다. 길거리에 동상을 한 번 세우고나면 그 동상은 다음날에도 다다음날에도 같은 자세 같은 위치에 있는 것과 같은 맥락이다.

그럼 static 메소드는 무엇일까?

우리는 우선 인스턴스에 대해서 이야기 할 필요가 있다.

class Restaurant {
  constructor() {
    this._menuA;
    this._menuB;
    this._menuC;
  }
}

우선 위의 클래스를 봐보자 위의 레스토랑 클래스의 매뉴들은 동적일까 정적일까? 레스토랑의 경우 특정 메뉴의 매출량이 다른 메뉴에 뒤떨어진 다면 그 메뉴를 없앨 수도 있다.

위에서 메뉴들은 인스턴스 변수로 선언되어 있다. 이들은 Restaurant 클래스를 통해서 내부로 접근할 수 있다. 레스토랑을 예시로 계속 설명해보자면 레스토랑의 메뉴를 바꾸고 싶다면 어떻게 해야 할까? 레스토랑의 주인의 허락을 얻고 바꾸는게 가능할 것이다.

코드에서도 비슷한 취지이다. 우리가 메뉴를 바꾸기 위해서는 const restaruatnt = new Restaurant(); 를 통해서 주인에게 접근하고 restaruatnt._meunA 접근이 가능할 경우 메뉴에 대한 정보에 도달할 수 있는 것이다.

그렇다면 인스턴스란 도대체 무엇일까? 클래스 내부의 contructor()를 이용하여 생성된 모든 객체들을 인스턴스라고 한다. 하지만 이러한 의미로도 잘 이해가 가지 않는다. 그렇다면 다른 경우를 봐보자 데이터베이스에서 인스턴스는 특정한 순간의 데이터를 저장한 것입니다. 이 데이터는 순간을 포착한 데이터이기 때문에 추후에 상태가 변할 수도 있습니다. 이렇게 생각하니까 이해하는데 조금 도움이 되는것 같습니다.

보통 클래스에서 인스턴스화를 한다고 하면 생성자(constructor)를 호출하여 새로운 객체를 초기화하여 새로운 데이터를 저장하는 것을 인스턴스화라고 표현합니다. 이제 이해가 좀 되는것 같습니다. 왜 클래스 내부에서 정의 되는 변수, 메서드등을 인스턴스라고 표현하는지 알것 같습니다.

하지만 우리는 아직까지도 정적인 메소드에 대해서 설명하지 않았습니다!

static 으로 정의된 메소드나 변수들은 인스턴스를 통해서 접근할 수 없습니다. 클래스를 통해서만 접근할 수 있습니다. 이 말이 무슨 소리인지 봐보겠습니다.

class Home {
  constructor() {
    this.mom = "HI";
  }

  static dad = "Hello";
}

const home = new Home();

console.log(home.mom); // 인스턴스 변수 호출
console.log(Home.dad); // 정적 변수 호출

위의 예제에서 dad에 접근하기 위해서 Home 클래스를 통해 직접적으로 값을 호출 했다. 하지만 인스턴스 변수를 호출하기 위해서 우리는 new 를 통해 클래스의 인스턴스에 접근했다.

정적필드는 퍼블릭 필드다

정적 메소드는 유틸리티 함수로 쓰는게 주이다. 수학 계산, 날짜 및 시간 관련 작업등 특정 클래스와 관련이 없고 반복적으로 사용되는 일반적인 작업이나 기능을 수행하기 위한 도우미로써 쓰인다.

정적 메소드는 객체를 생성하거나 복제하는 함수와 같은 유틸리티 기능인 반면 정적 프로퍼티는 캐시, 인스턴스 간에 복제할 필요가 없는 다른 데이터에 유용하다.