
코드에서 사용되는 변수는 어디에서나 사용 가능할까요?
아래와 같은 클래스바로 아래 있는 변수는 메서드 내부에서는 사용 가능합니다.
하지만 main 에서는 사용 불가능하다고 빨간줄이 뜹니다.
이러한 이유는 모든 클래스는 인스턴스화 하지 않은 채로 사용할 수 없기 때문입니다.

testScope 에서 선언된 val0 은 메서드 내부에서는 사용 가능하지만 main 안에서는 사용되지 않는 모습을 볼 수 있습니다.
위에서 말했듯이 인스턴스화 하지 않았기 때문입니다.
val2는 왜 빨간글씨가 뜨지 않을까요?
우리는 main 안에서는 인스턴스화를 하지 않습니다.
바로 public static void main() 의 static 때문입니다.
static 을 사용하면 인스턴스화 하지 않아도 사용 가능합니다.
그래서 main 안에서는 인스턴스화 하지 않아도 됩니다.
val2는 정상적으로 나오는 것을 볼 수 있죠.
앞서 말했듯이 static 이 있으면 인스턴스화 하지 않아도 사용이 가능합니다.
이는 main 안에서가 아닌, 밖에서 선언된 변수도 포함됩니다.
그렇다면 main 외부에서 선언된, static 하지 않은 변수는 main에서 사용 불가할까요?
아닙니다.
처음에 말했듯이 인스턴스화를 거쳐주면 사용 가능합니다.
public class testScope {
int val0 = 10;
static int val1=100;
public void scope(){
System.out.println(val0);
System.out.println(val1);
}
public static void main(String[] args) {
int val2 = 1000;
//being instance
testScope testScope=new testScope();
System.out.println(testScope.val0);
System.out.println(val1);
System.out.println(val2);
}
}
public class testScope {
int val0 = 10;
static int val1=100;
public void scope(){
System.out.println(val0);
System.out.println(val1);
}
public static void main(String[] args) {
int val2 = 1000;
//being instance
testScope testScope1 =new testScope();
System.out.println(testScope1.val0); //10
testScope testScope2= new testScope();
System.out.println(val1); //100
System.out.println(val2); //1000
testScope1.val0=20;
testScope2.val0=30;
System.out.println(testScope1.val0); //20 cuz its instance value
System.out.println(testScope2.val0); //30
testScope1.val1=40;
testScope2.val1=50;
System.out.println(testScope1.val1); //50 cuz its class value
System.out.println(testScope2.val1); //50
}
}

왜 testScope1,2 의 val1에 40 과 50을 대입했음에도 결과는 둘 다 50 50 이 나올까요?
클래스 변수이기 때문입니다.
static 한 변수는 값을 저장할 수 있는 공간이 하나밖에 없기 때문에 값을 공유해서 static 한 val1 은 50이 나오는 것을 볼 수 있습니다.
따라서 어차피 static 은 같은 값을 공유하기 때문에 인스턴스를 참조하는 변수명을 쓰기 보다는 클래스명을 직접 사용하는 것도 가능합니다.
System.out.println(testScope.val1); //100 cnz its class value
System.out.println(testScope.val1); //100