static 변수란?
•
객체를 생성하지 않고 접근이 가능한 변수
•
정적 변수, 클래스 변수, 공용 변수 와 같은 뜻
•
프로그램 실행 시, static 변수가 메모리에 올라감. → 종료 시 메모리에서 내려감
static 변수는 클래스 명으로도 접근 가능하다.
Class A {
static int B;
}
public static void main(String[] args) {
A a = new A();
A.B++;
a.B++;
}
Java
복사
위 코드처럼 객체 생성 없이 선언이 가능하다.
객체를 생성해도 접근이 가능하다.
예제 코드
public class StaticVar {
public static void main(String[] args) {
InstCnt instCnt1 = new InstCnt();
InstCnt instCnt2 = new InstCnt();
InstCnt instCnt3 = new InstCnt();
}
}
class InstCnt {
static int instNum = 0;
int norNum = 0;
public InstCnt() {
instNum++;
System.out.println("인스턴스 생성: " + instNum);
norNum++;
System.out.println("인스턴스 생성2: " + norNum);
}
static public void print(){
// norNum++; // static 메서드 안에서 인스턴스변수 선언 불가
}
}
Java
복사
결과
인스턴스 생성: 1
인스턴스 생성2: 1
인스턴스 생성: 2
인스턴스 생성2: 1
인스턴스 생성: 3
인스턴스 생성2: 1
Java
복사
•
객체의 생성자가 호출될 때마다 static 변수는 증가한다.
→ 객체변수가 많이 생겨도 static 은 하나만 가리킨다.
•
인스턴스 변수는 매번 초기화되기 때문에 증가하지 않는다.
•
print() 메서드 처럼 static 메서드 안에서는 인스턴스 변수 선언이 불가하다.
→ static 메서드는 객체 생성을 안해도 실행 시 메모리에 올라간다.
→ 인스턴스 변수는 객체 생성을 해야 메모리에 올라간다.
위 두 과정이 충돌을 일으켜 컴파일 에러가 난다.
static 변수 메모리 이해 (카드 예제)
•
static 변수 선언시, Method Area (Static Area) 에 static 변수의 자리가 마련된다.
→ Heap 영역이 아니기에, 프로그램이 종료될 때 까지 지워지지 않는다.
•
객체 변수 생성 시, static 변수의 주소를 바라보는 부분이 자동으로 할당된다.
→ 보통 메모리를 그릴 때, 저 영역은 그리지 않는다.
•
다른 객체 변수여도 static 변수는 같은 곳을 가리킨다.
main 함수가 public, static 인 이유
•
static 인 이유
→ 인스턴스 생성과 상관없이 가장 먼저 호출되기 때문에
•
public 인 이유
→ 일종의 약속. 외부로부터 시작되는 명령이기에 접근 가능해야 한다.