= 정적인, 움직이지 않는
즉, 메모리에 고정적으로 할당되어 프로그램이 종료될 때 해제되는 변수나 함수에 쓰는 키워드이다.
- 고정 메모리이므로 효율적으로 메모리를 사용할 수 있다.
- 객체를 생성하지 않고 사용하기 때문에 속도가 빠르다.
- 공유자원
- 무분별한 static 사용은 메모리 낭비를 불러올 수 있다.
(method 영역은 GC가 작동하지 않기 때문에 사용하지 않아도 프로그램 종료까지 메모리를 차지함)- 오류발생 시 디버깅이 어려움
(코드의 여러 부분에서 영향을 받기 때문에 변화추적이 어렵다. -> 캡슐화를 위배해 객체지향적이지 않음)- static 메소드에서는 only static 변수만 사용가능
- 상속불가능 -> 확장에 어려움
static 변수는 클래스 내부에 선언해 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 메모리 공간이 할당된다. 그리고 그 값은 모든 인스턴스(객체)가 공유한다. 다른 멤버 변수처럼 인스턴스가 생성될 때마다 새로 생성되지 않는다. 이런 이유 때문에 static 변수를 클래스에 기반한 변수라고 해서 '클래스 변수(class variable)' 라고도 한다.
- 클래스가 사용되기 전, 미리 static을 메모리에 올린다.
- 객체 생성없이 바로 사용가능 -> 즉, 객체 생성과 무관하다. (static 변수는 객체보다 먼저 생성된다.)
- 공유변수나 공유메소드로 사용가능 -> 메모리 사용 최소화
- static 메소드 내에서는 일반 변수를 사용할 수 없다. (일반 변수는 늦게 메모리에 올라가기 때문)
객체 생성 없이 "클래스.메서드()" 형태로 호출 하는 방식. 인스턴스 멤버와 관련 없는 작업을 하는 메서드이다. 메서드 내에서 인스턴스 변수(멤버 변수)를 사용할 수 없다. (static 변수만 사용 가능)