class static 정적 메서드

Jaemin Jung·2022년 1월 29일
0

JavaScript

목록 보기
11/14
post-thumbnail

정적 & 동적

프로그래밍을 배우다보면 정적, 동적이라는 단어를 많이 사용한다.
정적과 동적은 무엇을 의미하는 것일까?
정말 간단하게 말하자면,

  • 컴퓨터 분야에서 사용되는 '정적(static)'이란 한번 정해놓으면 변경이 안되는 것이다.

  • 컴퓨터 분야에서 사용되는 '동적(dynamic)'이란 실시간으로 상황에 따라 변경이 가능한 것이다.

class static

class의 static은 정적인 메소드나 변수를 정의할 때 사용한다.
이게 무슨 말인지는 예시를 통해 설명하겠다.

class Student {
  constructor (name, age, major) {
    this.name = name;
    this.age = age;
    this.major = major
  }
  
  introduce () {
    return `Hi my name is ${this.name}, I'm ${this.age} years old, I majored in ${this.major}`
  }
  
}

const james = new Student('james', 29, 'Hotel');

james.introduce();
// "Hi my name is james, I'm 29 years old, I majored in Hotel"

일반적으로 클래스에서 메서드를 정의하는 방식이다.
이렇게 되면 new 키워드를 통해 생성된 인스턴스인 james는 아무런 제약없이 introduce()를 사용할 수 있게 된다.
(인스턴스: new 키워드로 class의 청사진을 따라 생성된 객체)
이러한 메서드는 인스턴스의 프로토타입에 정의된다.
인스턴스 메서드, 프로토타입 메서드라고 한다.

class에서 static 키워드를 통해 정적 메서드나 변수를 정의한다.
이 static 키워드를 통해 생성된 메서드나 변수는 인스턴스의 프로토타입에 정의되지 않는다.
그래서 인스턴스에서는 접근이 불가능하다.

class Student {
  constructor (name, age, major) {
    this.name = name;
    this.age = age;
    this.major = major
  }
  
  introduce () {
    return `Hi my name is ${this.name}, I'm ${this.age} years old, I majored in ${this.major}`
  }
  
  static sayHello () {
    return `Hello`
  }
  
}

const james = new Student('james', 29, 'Hotel');

james.sayHello(); // TypeError: james.sayHello is not a function
Student.sayHello(); // 'Hello'

위 예시처럼 james 인스턴스는 static 키워드로 정의된 정적 메서드를 사용 불가능하다.
class 자체인 Student만이 정적 메서드에 접근이 가능하다.
정적 메서드의 경우 this 키워드는 class를 참조한다. this 를 사용하여 동일한 클래스 내의 다른 정적 메서드에서 정적 메서드를 호출할 수 있다.

그럼 이걸 왜 해야하는데?

보통 해당 Class의 소속인 인스턴스들의 개별적인 동작이 아니라,
소속 여부의 확인, 소속 부여 등의 공동체적인 판단을 필요로 하는 경우에 static 메서드를 활용하곤 한다.

내가 맡은 과업에서는 Api 호출하는 메서드를 static으로 정의했다.
Api 호출시에 받는 데이터는 동적 데이터이긴 하지만,
지금 과업에서 Api들을 class 내부에 static으로 정의한 부분과는 엄연히 다른 이야기이다.
이 Api를 호출하는 메서드는 굳이 인스턴스로 생성해서 사용할 필요는 없기 때문과 그 메서드의 내용은 변하지 않기 때문에 static으로 정의한 것이다.

하지만, static 을 굳이 사용 할 필요도 없다고 한다.
static 으로 정의된 메서드는 class 선언시에 정적 메소드는 같이 선언되어 메모리에 올라가기 때문에
효율적인 메모리 관리를 위해서는 다른 좋은 방식을 고민해봐야한다.
보통 유틸 함수를 정적 메서드로 정의해서 사용한다고 한다.

참고 사이트

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes/static
https://runebook.dev/ko/docs/javascript/classes/static
https://seo-tory.tistory.com/47

profile
내가 보려고 쓰는 블로그

0개의 댓글