자바의 static이란, 내가 이해한 바로는 메모리 영역에 사라지지 않는 자리를 만들어 놓고 모든 객체가 접근 가능하도록 해놓는다는 것을 의미한다. 그렇다고 전부 이용이 가능한 것은 아니고, class가 메모리 영역에 적재될 때부터 사용 가능하다는 의미이다. 하지만 사용하지 않는 메모리를 수거해 가는 Gabage collector가 static영역에 있는 메모리값은 정리를 하지 못하므로 static을 남발할 경우 시스템 성능에 악영향을 끼칠 수 있다.
class Number{
static int num = 0; //클래스 필드
int num2 = 0; //인스턴스 필드
}
public class Static_ex {
public static void main(String[] args) {
Number number1 = new Number(); //첫번째 number
Number number2 = new Number(); //두번쨰 number
number1.num++; //클래스 필드 num을 1증가시킴
number1.num2++; //인스턴스 필드 num을 1증가시킴
System.out.println(number2.num); //두번째 number의 클래스 필드 출력
System.out.println(number2.num2); //두번째 number의 인스턴스 필드 출력
}
}
Number이라는 클래스안에 클래스 변수 num과 인스턴스 변수 num2를 생성하였고 두개의 Number인스턴스 number1과 number2를 생성했을때 number1에서 num1과 num2를 각각 1씩 증가시키고 number2에서 num1와 num2를 각각 출력시켰을때는 num1은 1, num2는 0이 출력되었습니다. 왜 이런 현상이 나타났느냐면 인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 가지지만 정적 변수는 모든 인스턴스가 하나의 저장공간을 공유하기에 항상 같은 값을 가지기에 나타난 현상입니다.