Java - static

0

응애나애기개발자

목록 보기
5/5

static

참고 강의
생활코딩 : JAVA 객체 지향 프로그래밍 - 6. static
https://www.youtube.com/watch?v=hvTuZshZvIo

  • 정적 변수
  • 클래스 내부에 선언
  • 인스턴스가 생성될 때마다 새로 생성되는 변수가 아닌, 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 가장 먼저 메모리 공간이 할당된다.
  • 그 값은 모든 인스턴스가 공유한다.
  • 클래스에 기반한 변수이기 때문에 '클래스 변수' 라고도 한다.

예제 - 1

package main.java;

class Foo{
    public static String classVar = "I class var";  // static 변수 : 앞에 static이 붙었으므로 class 소속
    public String instanceVar = "I instance var";   // instance 변수 : 앞에 static 없으므로 instance 소속
}

public class StaticPrac {
    public static void main(String[] args) {
        System.out.println(Foo.classVar);
        System.out.println(Foo.instanceVar);        // instance를 통해서만 사용가능
    }
}

:
I class var


예제 - 2

package main.java;

class Foo{
    public static String classVar = "I class var"; 
    public String instanceVar = "I instance var"; 

    public static void classMethod(){               // class형 메소드
        System.out.println(classVar);               // static 변수에 접근이 가능
//      System.out.println(instanceVar);            // instance 변수에는 접근이 불가능하다.
    }

    public void instanceMethod(){                   // instance 메소드
        System.out.println(classVar);               // static 변수에 접근이 가능
        System.out.println(instanceVar);            // instance 변수에 접근이 가능
    }
}

public class StaticPrac {
    public static void main(String[] args) {
        System.out.println(Foo.classVar);
//      System.out.println(Foo.instanceVar); 
    }
}

예제 - 3

package main.java;

class Foo{
    public static String classVar = "I class var";
    public String instanceVar = "I instance var";

    public static void classMethod(){               // class형 메소드
        System.out.println(classVar);               // static 변수에 접근이 가능
//      System.out.println(instanceVar);            // instance 변수에는 접근이 불가능하다.
    }

    public void instanceMethod(){                   // instance 메소드
        System.out.println(classVar);               // static 변수에 접근이 가능
        System.out.println(instanceVar);            // instance 변수에 접근이 가능
    }
}

public class StaticPrac {
    public static void main(String[] args) {
        System.out.println(Foo.classVar);
//      System.out.println(Foo.instanceVar);
        Foo.classMethod();
//      Foo.instanceMethod();       // intstance Method는 instance 소속이기 때문에 class를 통해 접근 불가능
    }
}

예제 - 4

package main.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);
    }

    public void instanceMethod(){
        System.out.println(classVar);
        System.out.println(instanceVar);
    }
}

public class StaticPrac {
    public static void main(String[] args) {
        System.out.println(Foo.classVar);
//      System.out.println(Foo.instanceVar);
        Foo.classMethod();
//      Foo.instanceMethod();

        Foo f1 = new Foo();     // f1 인스턴스 생성
        Foo f2 = new Foo();     // f2 인스턴스 생성

        System.out.println(f1.classVar);    // I class var
        System.out.println(f1.instanceVar); // I instance var

        f1.classVar = "changed by f1";      // f1의 classVar 변수를 변경 -> 클래스와 모든 인스턴스도 같이 변경
        System.out.println(Foo.classVar);   // changed by f1
        System.out.println(f2.classVar);    // changed by f1

        f1.instanceVar = "changed by f1";   // f1의 인스턴스 변수를 변경 -> 본인 인스턴스만 변경
        System.out.println(f1.instanceVar); // changed by f1
        System.out.println(f2.instanceVar); // I instance var
    }
}

  • class의 변수를 변경하면 모든 인스턴스의 변수 값도 함께 바뀐다.
    인스턴스의 값을 바꾸면 class의 변수도 바뀌고, 그 class를 사용하는 모든 인스턴스의 값도 바뀐다.
  • instance 변수는 새로 생성된 인스턴스에 복사한 것과 같은 개념이므로 한쪽에서 바꾸더라도 다른 한쪽에서는 바뀌지 않는다.

0개의 댓글