본문 바로가기

LANG../JAVA

static

static

  • static 제한자는 변수, 메서드에 적용되는 자바의 키워드
  • static 메서드나 변수는 해당 클래스의 객체 없이도 참조 가능하다.
  • static 블록(static 메서드, static 초기화자) 안에는 static 변수만 사용해야하고, static 메서드만 호출할 수 있다. 즉 static 블록에서 non-static 멤버를 객체 생성 없이 직접 참조할 수 없다.
  • static 제한자는 지정된 변수와 메서드를 객체와 무관하게 만들어주기 때문에 this를 가질 수 없다.
  • static 메서드는 non-static 메서드로 재정의(Overriding) 될 수 없다.
  • static에 단순히 블록({ })을 사용한 경우에는 정적 초기화자라고 부르며, static 변수를 초기화하는 역할을 가지고 클래스가 로딩될 때 main() 메서드가 있더라도 그보다 앞서 딱 한 번 실행된다.

 

1.정적 변수(static variables)

  • 클래스의 모든 인스턴스가 공유하는  변수를 선언할 때 사용한다.
  • 클래스 이름을 통해 접근 가능하다.
  • 인스턴스 변수가 객체마다 독립적인 반면, 정적 변수는 모든 객체에서 동일한 값을 가진다.

 

2.정적 메서드(static methods)

  • static 메서드는 해당 클래스의 객체 생성 없이도 참조가 가능하다.
  • static 메서드에서 멤버를 참조할 때 주의해야 할 사항은 "static 메서드 안에서는 non-static 멤버를 객체 생성 없이 직접 참조할 수 없다"
  • static 메서드 안에서는 static 변수를 선언할 수 없다.

 

3. 정적 블록(static initializer Block)

  • 정적 초기화 블록은 static 변수들의 초기화에 사용한다. 일반 멤버변수는 생성자에서 초기화하지만 static 변수는 객체 생성 없이도 사용해야하므로 생성자를 통해 초기화할 수 없다.
  • static 변수는 정적초기화자를 통해 초기화를 합니다.
  • 정적 초기화 블록은 클래스가 로드될 때 생성자와 main() 메서드에 앞서 오직 단 한 번만 실행된다.

 


[ key point ]

- static은 heap 영역에 저장되지 않는다. 

- static은 클래스 로딩 시점에 한 번 초기화되고 모든 인스턴스에서 동일값을 가진다.

- static 사용은 동시성 문제때문에 최대한 피해야 한다.