Java - Static ?

  • static은 정적이라는 의미를 가지고 있는데, 변수와 메서드에 지정하여 사용할 수 있다.
  • 변수에 사용할 경우 클래스 변수라고 부르는데, 우리가 알고 있는 4가지 변수인 지역변수, 매개변수, 인스턴스변수, 클래스변수 중 하나이다.
  • 정적 변수와 정적 메서드는 인스턴스에 속한 멤버가 아니라, 클래스에 고정된 멤버이기 때문에 클래스 로더가 클래스를 로딩해서 JVM 클래스 영역에 적재할 때 클래스별로 관리가 된다.
  • 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있다.
  • 우리가 동적 로딩이 너무 느릴 경우를 대안해서 공통적으로 사용해도 괜찮은 변수와 메서드에는 static을 붙여 그 단점을 보완하기도 한다.


즉, 객체 생성을 하지 않고 클래스 변수나 메서드를 호출하도록 하는 제어자인 것이다.


1. Static 변수

  • static으로 선언된 변수는 그 값을 공유한다.
      class Count() {
          static int count = 0;
       
          public countUp() {
              this.count ++;
          }
      }
    	
      public void static main(String[] args) {
          Count c1 = new Count();
          Count c2 = new Count();
    
          c1.countUp();
          c2.countUp();
      }
    
    • 이라는 클래스가 있다.
    • 이렇게 하면, count 변수가 static이기 때문에 메모리를 공유하여 c1으로 조회를 하든, c2로 조회를 하든, 2가 된다.



2. Static 메서드

  • 메서드를 static으로 선언하면, 해당 클래스를 인스턴스화 하지 않아도 메서드 호출이 가능하다. 대신 인스턴스에서는 호출이 불가능하다.
  • static 메서드는 오버라이딩 할 수 없다.
  • static 메서드 안에서는 인스턴스 변수… 즉 클래스 내에서 static이 붙지 않은 변수는 사용할 수 없다.
      public class Count() {
          static int count = 0;
       
          public static countUp() {
              this.count ++;
          }
      }
    
    • 이렇게 메서드에 static이 붙으면
      Count.countUp();
    
    • 이렇게 인스턴스를 생성하지 않고 메서드를 사용해야 한다.

3. Static 의 장,단점

장점

  • 메모리 측면에서 효율적일 수 있다. static 영역에 저장되어있는 메모리를 사용하기 때문에, heap 영역에 매번 인스턴스를 만들지 않아도 된다.
  • 객체를 생성하지 않고 사용 가능하기 때문에 속도가 빠르다.


단점

  • static 메모리는 GC의 대상이 아니기 때문에, static을 과하게 사용할 시 반대로 메모리에 문제가 생길 수 있다.
  • 객체지향적이지 못하다.
    • 왜냐하면 static에는 private를 사용할 수 없기에, 캡슐화가 되지 않기 때문이다. 그래서 데이터 은닉이 약해질 수 있다.
  • 재사용성을 높여주는 자바의 객체지향 기능인 인터페이스를 이용한 설계 및 구현에 방해를 준다.
  • 다중 스레드 롼경에서 안전하지 않을 수 있으며, 동기화 문제가 발생할 수 있다.
    • syncronized 등 별도의 동시성 문제를 해결하는 코드를 작성해주어야 한다.
  • 공유 메모리기 때문에 예측 불가능한 버그가 발생할 수 있으므로, 테스트를 확실히 해야한다.



즉, static을 사용할 때는 신중하게 고려해야되며 객체 지향 디자인 원칙을 준수 하고, 동기화 문제를 고려해야 한다.


특히, 메모리를 많이 사용할 수 있는 Collection 류의 자료구조를 static으로 선언하는데에 유의해야하며, 배치와 같이 주기적으로 사용해야하는 경우에만 static을 사용하는 것이 좋다.






results matching ""

    No results matching ""