static 키워드와 단점

1c2·2024년 4월 2일
0

CS

목록 보기
7/19

static 키워드의 사용 이유와 단점

static 키워드는 프로그래밍 언어에서 클래스 레벨의 속성과 메서드에 사용되며, 이를 통해 인스턴스 간에 공유될 수 있는 변수나 메서드를 정의한다. 주로 Java에서 static의 개념을 배우며, JavaScript에서도 유사한 방식으로 사용될 수 있다.

static 키워드 사용 이유

  • 클래스 소속: static으로 선언된 속성이나 메서드는 클래스의 인스턴스가 아닌 클래스 자체에 속하며, 모든 인스턴스가 공유한다.
  • 효율적 정의: 클래스로 만들어지는 객체 사이에서 공통적으로 사용되는 메서드나 속성을 효율적으로 정의할 때 사용된다.
  • 명시성: static 키워드를 사용함으로써 해당 메서드나 속성이 클래스의 모든 객체들에 의해 공유됨을 명시적으로 표현한다.

static 키워드의 단점

  • 전역 상태 관리 문제: static 변수는 애플리케이션의 전역 상태를 만들 수 있어, 코드의 예측성과 관리성을 저하시킬 수 있다.
  • 객체 지향 원칙 위배: 객체 지향 프로그래밍의 핵심 원칙인 캡슐화와 다형성과 대비되며, static 메서드는 오버라이드가 불가능하다.
  • 테스트 어려움: static 상태는 테스트 간에 유지되므로, 테스트가 서로에게 영향을 줄 수 있어, 격리된 테스트 환경 구축이 어렵다.

JavaScript에서의 static

JavaScript에서도 클래스의 static 메서드나 속성을 정의할 수 있으며, 이는 주로 유틸리티 함수나 클래스 내에서 공유되어야 하는 상수 값을 정의할 때 유용하게 사용된다. JavaScript의 static 사용법은 Java와 유사하며, ES6 이후의 클래스 문법에서 지원된다.

static 키워드의 사용은 프로그램의 특정 요구 사항에 따라 결정되어야 하며, 그 장단점을 충분히 이해하고 사용해야 한다.

public class Person {
  // 멤버변수(속성)
  String name;
  int IQ;
  int str;
  private static final String GUDOC = "큰돌의 터전";
  // constructor
  public Person(String name, int IQ, int str){
    this.name = name;
    this.IQ = IQ;
    this.str = str;
  }
  public Person(){
    this.name = "alanwalker";
    this.IQ = 100;
    this.str = 100;
  }
  // 메서드
  public void levelup(){
    this.IQ = this.IQ + 1;
    this.str = this.str + 1;
    System.out.println(this.name + "의 지능과 힘이 증가했습니다!
    " + this.IQ + " / " + this.str);
  }
  // public void talk(Person a, Person b){
    // System.out.println(a.name + " & " + b.name + "이 대화를
    시작했다!");
  // }
  private static void talk(Person a, Person b){
    System.out.println(a.name + " & " + b.name + "이 대화를
    시작했다!");
  }
  public static void main(String[] args) {
    Person a = new Person(); // 객체 >> 인스턴스
    a.levelup();
    Person b; // 객체
    b = new Person("큰돌", 1000, 1); // 인스턴스
    b.levelup();
    Person.talk(a, b);
    System.out.println(Person.GUDOC);
  }
}

static 키워드의 단점: 메모리 관리

static 키워드로 선언된 변수, 블록, 또는 메서드는 선언과 동시에 힙(heap) 영역이 아닌 메소드 영역(Method area)에 할당됩니다. 이러한 특성 때문에 프로그램이 종료될 때까지 가비지 컬렉터(GC)에 의해 메모리가 회수되지 않습니다. 따라서, 해당 클래스가 객체로 사용되지 않는 경우에도 메모리 공간을 계속 차지하게 되어 메모리 낭비를 유발할 수 있습니다.

이는 특히 클래스가 더 이상 사용되지 않거나 매우 드물게 사용되는데도 불구하고, 프로그램의 실행 동안 계속 메모리를 점유하게 되므로 효율적인 메모리 사용 측면에서 단점이 될 수 있습니다.

0개의 댓글