해당 게시물은 "생활코딩 - JAVA 객체 지향 프로그래밍" 유튜브 강의를 정리한 내용입니다.
class Foo{
public static String classVar = "I class var";
public String instanceVar = " I instance var";
public static void classMethod(){
System.out.println(classVar);
//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(); // error
}
}
static은 클래스 소속이기에 static 클래스에서 static 변수는 오류가 안나고, main 클래스에서도 static 클래스와 static 변수 모두 문제가 안생기나, instance 는 오류가 난다.

class 변수와 instance 변수는 그림과 같이 링크가 연결되어 있다.
이 말은 즉, class 변수를 바꾸면 모든 instance 의 값이 바뀌고,
instance 에서 class 변수를 바꾸면 그 class 변수를 사용하는 모든 instance의 값도 바뀐다는 의미다. 다만, instance의 instance 변수를 바꾼다고 해서 class Foo 의 인스턴스의 값이 바뀌지는 않는다.
class Foo{
public static String classVar = "I class var";
public String instanceVar = " I instance var";
public static void classMethod(){
System.out.println(classVar); // I class var
}
public void instanceMethod(){
System.out.println(classVar); // I class var
System.out.println(instanceVar); // I class var
}
}
public class StaticApp {
public static void main(String[] args){
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"; // 인스턴스의 class 변수를 바꾼다.
System.out.println(Foo.classVar); // Changed by f1
System.out.println(f2.classVar); // Changed by f1
f1.instanceVar= "changed by f1"; // 인스턴스의 instance 변수를 바꾼다.
System.out.println(f1.instanceVar); //changed by f1
System.out.println(f2.instanceVar); // I instance var
// 본연의 class에서의 instance 변수는 바뀌지 않으므로
//인스턴스 f2 는 여전히 class Foo 본연의 instance 변수를 사용한다.
}
}