학원/JAVA

9.27 10-2 정적멤버변수 vs 인스턴스형멤버변수

도원결의 2022. 9. 27. 22:48

멤버변수는 크게 정적멤버 변수와 인스턴스형 멤버변수로 나눈다
멤버메소드도 정적메소드 와 인스턴스형 메소드로 나눈다.


멤버변수나 멤버 메소드 앞에 static이라는 modifier가 붙으면 정적 멤버 즉 정적 멤버변수이거나 정적 메소드이다.
 

예]  int age;    인스턴스형 멤버변수
     static int age;   정적 멤버변수
     public void method(){};   인스턴스형 메소드
     public static  void method(){};   정적 메소드
     static  public void method(){};    바꿔서 써도 가능

 


    ************단, class앞에는 static을 붙일 수 없다******
※ 정적멤버(상수 ,변수 혹은 메소드)의 메모리는 JVM에서 클래스를 로드할 시점에 생기고
   인스턴스형 멤버는 JVM에서 인터프리터 할때 메모리가 생성된다.(즉 new연산자로 인스턴스화 할때 생긴다)

 

컴퓨터작동 순서 : 클래스 로드 -- --- > 오류확인 --------->인터프리터가 main 코드 찾아 실행

 

 

※ 클래스의 멤버에 접근시 접근 방법

 1]인스턴스형 멤버 :

       -인스턴스변수.멤버
       -클래스명 인스턴스변수 = new 생성자();  메모리생성(객체화,인스턴스화) 후 접근
          인스턴스변수.멤버;

 2]정적 멤버 :   클래스명.멤버                  클래스명으로 바로 가능
※ 정적 멤버는 인스턴스화된 객체마다 갖고 있는 멤버가 아니라 하나만 생성되서 모든 객체가 공유한다.
    그래서 공통으로 사용하는 변수나 메소드에 주로 static을 붙인다.

static class StaticClass { }  클래스 앞에는 static을 못 붙인다


class MyStatic{
    인스턴스형 멤버변수  :  반드시 클래스를 인스턴스화(객체화,heap영역에 메모리 생성) 하여 인스턴스변수로 접근
        int   instanceVar;     

  
   정적 멤버변수  : 인스턴스화 할 필요 없이 클래스명으로 접근
  왜냐하면 JVM에서 클래스를 로드할때 메모리가 이미 생성됨으로
        static int staticvar;

 


   인스턴스 메소드
            void instanceMethod() {
                    System.out.println(instanceVar);   인스턴스형 메소드 안에서는 모든 멤버사용 가능
                     System.out.println(staticvar);        
                                     }///instanceMethod        


   정적메소드
      static void staitcMethod() {
     System.out.println(instanceVar); static메소드는 class로드할때 메모리 생기는데 instanceVar얘는 아직 메모리 할당 안되서 같이갈 수 없음. 즉 정적메소드에선 인스턴스변수 사용이 안된다!
       System.out.println(staticvar);    
                    }////staitcMethod
     }
         

public class StaticModifier {
인스턴스형 멤버
          int instanceVar;
          void instnaceMethod() { }

정적 멤버
           static int staticVar;
           static void staticMethod() {}
   
public static void main(String[ ] args) {           
   System.out.println(MyStatic.staticvar);            정적멤버접근 - 클래스명.정적멤버 // 정적메소드();
    MyStatic.staitcMethod();
    MyStatic ms1 = new MyStatic();               인스턴스 멤버와 메소드는 이렇게 인스턴스 변수를 사용해서 접근!
    System.out.println(ms1.instanceVar);
   ms1.instanceMethod();


정적멤버를 인스턴스멤버처럼접근
System.out.println(ms1.staticvar); //실행엔 문제 없지만 웬만하면 정적멤버는 클래스명으로 접근하라
MyStatic ms2 = new MyStatic();

 


정적멤버는  클래스명.멤버   로 접근하나 자기 클래스 안에서 접근하기 때문에 클래스명 보통 생략
System.out.println(StaticModifier.staticVar);
StaticModifier.    staticMethod();  요렇게만 써도 가능
인스턴스형 멤버는 인스턴스화 후 접근
StaticModifier sm = new StaticModifier();
System.out.println(sm.instanceVar);
sm.instanceMethod();;


}////main

}/////class