static

Jiian·2022년 5월 3일

Java-Object-Oriented

목록 보기
2/7

해당 게시물은 "생활코딩 - 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 변수를 사용한다.


   }
}
profile
Slow and Steady

0개의 댓글