[Java] static 키워드

정리


static 이란

  • 공유되는 값에 사용
    • 모든 인스턴스에 공통적으로 사용해야 하는 값
  • 바뀌지 않는 값에 final과 함께 사용
  • static 메서드에서 non static 필드나 메서드에 접근 할 수 없다.
    • non static 보다 먼저 생성 되기 때문

static 사용 위치

  • static 멤버 변수
    • 클래스 변수라고도 부름
    • 모든 해당 클래스는 같은 메모리를 공유
    • 특정한 인스턴스에 종속되지 않음
    • 인스턴스를 만들지 않고 사용 가능
      • static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기 때문
      • System.out.println(Test.count);
  • static 메소드
    • 클래스 메소드라고도 부름
    • 오버라이드 불가
    • 상속 클래스에서 보이지 않음
  • static 블록
    • 클래스 내부에 만들 수 있는 초기화 블록
    • 클래스가 초기화될 때 실행되고, main() 보다 먼저 수행
  • static import
    • 다른 클래스에 존재하는 static 멤버들을 불러올 때 사용
    • 멤버 메소드를 곧바로 사용 가능
  • static inner class
    • 해당 클래스의 객체를 따로 생성하지 않고 사용 가능
    • static 변수와 메서드만 참조 가능
    • 바깥의 class는 static 클래스라서 static을 붙이면 에러가 난다!
      • 즉 static을 붙일 필요가 없어서 안붙이는 것이지 static 클래스가 아니거나 불가능해서 static을 안붙이는 것이 아니다.

메모리상 위치

  • 클래스 변수는 JVM Runtime Data Area에서 Method area 에 들어감
    • 클래스는 Method area에, 객체는 heap에 올라감

static 장/단점

  • static 장점
    • 메모리를 효율적으로 사용 가능
      • 생성할 때마다 인스턴스가 힙에 올라가는 것이 아니라 고정 메모리이므로 효율적
    • 속도가 빠름
      • 객체 생성하지 않고 사용하기 때문에 빠름
        • 클래스가 메모리에 올라갈때 자동적으로 생성
  • static 단점
    • 무분별한 static의 사용은 메모리 Leak의 원인이 됨
      • 프로그램 종료 시점에 메모리 반환하므로 garbage collection 대상이 아니므로..
    • 많이 참조되는 static 변수는 오류 발생 시 디버깅이 힘들다.
    • 재사용성이 떨어짐
      • interface를 구현하는 데 사용될 수 없음.

참조