class Foo{
public static String classVar = "I class var";
public String instanceVar = "I instance var";
public static void classMethod() {
System.out.println(classVar); // Ok
// System.out.println(instanceVar); // Error
}
public void instanceMethod() {
System.out.println(classVar); // Ok
System.out.println(instanceVar); // Ok
}
}
public class StaticApp {
public static void main(String[] args) {
System.out.println(Foo.classVar); // OK
// System.out.println(Foo.instanceVar); // Error
Foo.classMethod();
// Foo.instanceMethod();
Foo f1 = new Foo();
Foo f2 = new Foo();
//
System.out.println(f1.classVar); // I class var
System.out.println(f1.instanceVar); // I instance var
//
f1.classVar = "changed by f1";
System.out.println(Foo.classVar); // changed by f1
System.out.println(f2.classVar); // changed by f1
//
f1.instanceVar = "changed by f1";
System.out.println(f1.instanceVar); // changed by f1
System.out.println(f2.instanceVar); // I instance var
}
}
static은 '정적'이라는 뜻으로 static이 붙는것과 아닌것의 메모리 할당시점이 다르다
Error라고 쓰여진 주석코드를 각각 e1,e2라 하겠다
e1이 발생한 이유는 instanceVar는 인스턴스 변수이기 때문에 객체가 생성이되어야 메모리에 할당이 되기 때문에 객체가 생성이 안된 시점에서는 호출할수 없기 때문이다.
반면 instanceMethod 속 instanceVar를 불러올수 있느 이유는 instanceMethod또한 인스턴스 메소드 이기 때문에 instanceVar가 호출된 시점에는 이미 인스턴스 객체가 생성되고 난 후이기 때문이다.
e2가 발생한 이유는 e1과 같다.
그 밑에 Foo.instanceMethod()가 안되는 이유는 instanceMethod()는 인스턴스 메소드이기 때문에 인스턴스 객체가 생성되어야 호출할수 있기 때문이다.