Daily coding

Java Basic : day 9 - Static 스태틱 본문

Language/Java_basic

Java Basic : day 9 - Static 스태틱

sunnnkim 2019. 11. 29. 16:51

Static 

private int number; // instance 변수
public static int staticNumber; // class 변수라고도 함
// 메모리에 직접 접근하는 변수이기 때문에 getter, setter 가 필요없다.

*
  메모리의 종류
    stack : local 변수, 선언된 { } 중괄호 블록이 끝나면 사라진다.
    heap : new 키워드, 동적할당, 메모리의 저장공간, Gabage Collecter가 지워줌
    static : 정적변수, 프로그램 시작부터 메모리에 상주하고 프로그램 끝나면 사라짐
                        메모리에 공간을 할당하고 값을 유지하기 때문에 주의해서 써야함
    system 
 

 

 

 

 static 메소드

: 스태틱 메소드는 이렇게 호출한다. 
 

  클래스명.스태틱함수명(파라미터);  

// 클래스명으로 접근하여 호출하기 때문에 
// 인스턴스를 생성하지 않고도 접근할 수 있다. 
// 그러나 인스턴스가 따로 없기 때문에 this 참조는 사용 할수 없다. 
// 또한, this를 사용하는 인스턴스 멤버,  
// 즉, 클래스 내부에 static이 아닌 멤버변수에 static 메소드가 접근할 수 없다. 
 ( this라는 객체 주소값이 아예 없기 때문에 따로 인스턴스를 선언하지 않으면 
 접근할 주소값이 없고, 스태틱은 참조값이 없고 직접 메모리에 접근하는 방식이다. ) 
 

 

 

 


public StaticClass(){

// Static 변수에 +1 하는 메소드 작성
public void method() {
          staticNumber++;
}


}

public class Lecture02_Static {
public static void main(String[] args) {

 


         System.out.println("static number : "+StaticClass.staticNumber); // 출력 : 0


         StaticClass.staticNumber = 1;
         System.out.println("static number : "+StaticClass.staticNumber); // 출력 : 1
         

         // static 변수는 선언과 동시에 메모리에 0이 셋팅이 된다.
         // static 변수나 메소드는 별도의 인스턴스 생성 없이 직접 클래스에 접근하여
         // 변수나 메소드를 사용할 수 있다.

 

 

 

 


클래스 객체가 여러개이지만 같은 이름의 static 메소드는 1개임

=> 데이터가 모두 하나의 공간에 저장되고 축적된다.
StaticClass sc= new StaticClass();
System.out.println("sc.staticNumber : " + sc.staticNumber); // 출력 : 1
sc.method(); // staticNumber++ 

StaticClass sc2= new StaticClass();
System.out.println("sc.staticNumber : " + sc.staticNumber); // 출력 : 2
sc.method(); // staticNumber++ 

StaticClass sc3= new StaticClass();
System.out.println("sc.staticNumber : " + sc.staticNumber); // 출력 : 3




}
}

// 실무 코드 


class StaticClass2{
         private int localValue=0;

         public StaticClass2() {
                  System.out.println("생성자 호출");

         }

         private void func() {
                  System.out.println("func() 호출");
                  System.out.println("localValue " + localValue);
         }

         private void method() {
                  System.out.println("method() 호출");
         }

// 실무에서는 클래스 내부에 static 메소드를 만들어서 한번에 여러 메소드를 호출하도록 한다. 
         public static StaticClass2 getInstance() {
                  StaticClass2 sc = new StaticClass2();
                  sc.method();
                  sc.func();
                  return sc;
         }

         // 위의 메소드는  
         // 메인함수에서 이렇게 사용한다.

         // StaticClass2.getInstance();

         // * 결과 
         // 생성자 호출
         // method() 호출
         // func() 호출


}