변수의 scope, 즉 변수를 사용할 수 있는 범위는 기본적으로 해당 블록 혹은 class 내부이다.
public class test{
int x = 10;
public void main(int value){
int result = value;
}
}
위에서 가장 최상위 class인 test에서 선언된 변수 x는 해당 클래스 전 범위에 걸쳐 사용이 가능하고, 내부 main class의 value 매개변수와 result는 내부적으로만 사용가능하다.
기존 class, method 등과 달리, 인스턴스에 의존하지 않고 그 자체로 class 등을 활용할 수 있는 형태를 말한다.
static 키워드를 사용하면 최상위 class 변수라 하더라도, 별도의 static 선언을 하지 않는다면 변수가 적용되지 않는다.
static 선언 시 인스턴스화하지 않더라도, 그 자체로 바로 사용가능하고 static화 하지 않은 field나 method 변수 및 클래스는 내부적으로 사용 불가능하다.
public class test{
int x = 10;
static int y = 5;
public static void main(String[], args){
result1 = y;
test t1 = new test();
result2 = t1.x;
}
}
이처럼 static으로 선언한 변수들은 static field 내에서 사용이 가능하다.
static하지 않은 class 및 method 내에서 static 변수를 사용하는 것은 가능하다.
인스턴스 변수는 말 그대로 인스턴스가 생성되면서 생성되는 변수로, 값을 수정할 수 있는 속성값이다.
test t1 = new test;
result1 = t1.x;
클래스 변수는 클래스를 통해 접근할 수 있는 변수로, 값을 저장하는 공간이 하나인 관계로 값이 그 하나로 정해진 상태로 공유되는 변수이다(수정불가).
public class test{
int static value = 1;
public static void main(String[], args){
result1 = value;
result2 = class.value;
}
}
이처럼 상위 클래스에서 선언된 static value를 직접 사용하거나, class를 별도로 인스턴스화하지 않고 class.value 등으로 바로 접근하여 사용가능하다.
클래스변수는 값을 공유하는 값이다.
즉 값을 저장하는 공간이 하나이기 때문에, 값을 수정한다기 보다는 공유한다(같은 메모리를 참조하기 때문에 다른 인스턴스를 생성한다는 것이 불가능하고, 하나의 값을 바라보고 공유한다).
프로그래머스 강의 - scope & static