v1.staticval에는 50을 넣고, v2.staticval에는 100을 넣었습니다. 그리고 각각을 출력합니다. 50과 100이 나오리라 기대가 되네요.
실행결과
7
10
10
20
100
100
실행결과 기대한 값인 50과 100이 아니라 100만 출력했습니다. 왜 그럴까요?
static한 필드는 인스턴스를 생성할 때 만들어지는 것이 아닙니다. 값을 저장할 수 있는 공간도 하나밖에 없습니다. 즉, 값을 공유합니다. 그래서 이런 변수를 클래스 변수라고 합니다. globalScope 같은 변수는 인스턴스를 생성할 때 생성되기 때문에 인스턴스 변수라고 합니다.
클래스 변수는 인스턴스를 선언하지 않아도 사용할 수 있으므로 지금 사용한 것처럼 ‘참조 변수.변수명’이라고 사용하기보다는 클래스명을 직접 사용합니다. 그러므로 ‘클래스명.클래스 변수명’ 이렇게 사용하는 것이 바람직합니다.
NOTE
변수의 생성 및 소멸 시점은 언제일까요? 클래스에서 사용하는 변수의 종류는 클래스 변수, 인스턴스 변수, 지역 변수로 구분할 수 있습니다.
클래스 변수는 static 키워드가 붙은 변수를 의미합니다. 클래스를 생성하지 않아도 실행파일이 메모리에 로드될 때 생성합니다. 즉, 프로그램을 시작할 때 생성했다가 프로그램을 종료할 때 소멸합니다.
인스턴스 변수는 클래스의 멤버로 설정하는 변수를 의미합니다. 클래스를 이용해 인스턴스화할 때 메모리에 할당됩니다. 즉, new 연산자를 이용해 객체를 생성할 때 생성했다가 객체가 소멸할 때 소멸합니다.
지역 변수는 클래스에 포함된 메서드에서 사용하는 변수입니다. 메서드를 사용할 때 메모리에 생성했다가 메서드를 종료하는 시점에 소멸합니다.