Static 개념
static 변수란 정적변수라고도 한다. (프로그램이 실행될 때 생성되며 프로그램이 종료될 때 사라진다.)
→즉 객체가 사라져도 사라지지 않는다.
non-static 멤버는 객체가 생길 때 객체마다 생기며 다른 객체들과 공유하지 않는다.
하지만 static 멤버는 객체를 생성하지 않고도 사용할 수 있으며 다른 객체들과 공유한다.
static 선언 방법은 다음과 같다.
class StaticSample {
int n; //non-static 필드
void g() {...} //non-static 필드
static int m; //static 필드
static void f() {...} //static 필드
}
다음은 코드를 통해 직접 알아보는 과정이다.
→ 다음과 같이 StaticSample1 클래스의 객체를 생성하지도 않았는데 static 변수인 hello1이 출력된 것을 알 수 있다.
→ 반 면 non-static인 hello2 변수는 객체가 생성되지 않았기 때문에 오류가 나는 것을 확인할 수 있다.
→ static 메소드 또한 객체 생성 전에 호출이 되는 것을 확인할 수 있다.
→ hello1 변수는 class 이름인 StaticSample1 과 객체 이름인 asset 을 통해 호출하여도 출력되지만
hello2 변수는 객체 이름인 asset 만을 통해 호출해야 출력되기에
static 멤버는 클래스멤버라고도 부르며
non-static 멤버는 인스턴스 멤버라고도 불린다. (인스턴스 = 객체)
→ 다음 코드를 통해 서로 다른 객체인 asset 과 dif 객체는 non-static인 hello2 변수는 각각 서로 다른 메모리 공간을 사용하기 때문에 다른 문장이 출력되는 것을 알 수 있으며 static 인 hello1 변수는 같은 메모리 공간을 사용하기 때문에 asset.hello1 = "asset static" 코드로 값을 변경 후에 dif.hello1 = "dif static" 코드로 값을 변경하면 마지막으로 바꾼 문장인 dif static이 출력되는 것을 알 수 있다.
결론 : static 은 동일한 클래스의 모든 객체들에 의해 공유되게 하는 예약어이다.