본문 바로가기
공부방/자바프로그래밍

자바 static 변수(정적변수)

by 오후 네시 2020. 7. 30.

static(정적변수)


1) 프록램 어디에서든 공유해서 사용할 수 있는 변수


2) 프로그램이 실행되면 메모리의 클래스 영역에 자동으로 로딩됨

- 반면, dynamic 변수(동적변수)는 프로그램 실행 중에 생성되며 stack이나 heap에 저장됨.


3) 프로그램이 끝날 때까지 메모리에 상주함.

그래서 평소에 함부로 쓰면 안되고, 꼭 필요할 때만 써야 한다.(메모리 낭비될 수 있으므로)

그리고 하나만 쓸 수 있다.

그래서 실무에서 프로그램을 짤 때는 static 변수를 많이 쓰지 않는다.



4) static method에서는 static member만 사용 가능함


class A{

String name=”kim”;

static int n=20;

}


public void print(){

System.out.println(name);

System.out.println(n);

}


public static void main(String[] args){

int a=10;

double b = 20.5;

System.out.println(name);  //에러. name 변수를 쓸 수 없음

System.out.println(n);  //이건 됨. 왜일까?


}


static method인 main 메소드에서 클래스 A의 멤버변수인 name을 사용하면 에러가 일어나는 이유는 프로그램 시작시 메모리에 로딩되는 순서와 관계 있다.

-> 

프로그램이 시작되면 static member들을 자동으로 메모리에 로딩시킴

그러고나서 main 메소드가 시작됨.

name 변수는 A클래스의 멤버변수이므로 A 클래스가 로딩되어야만 쓸 수 있음.

그러나

정적변수 n은 프로그램 시작 시 이미 로딩되어 있으므로 에러가 나지 않음.


굳이 name변수를 쓰려면, new 연산자를 이용해 A클래스의 인스턴스를 만들어야만 함.

-> A aa= new A();

System.out.println(aa.name);   요렇게.


요약하면 


static 메소드에서는 static 변수만을 쓸 수 있다.

static이 아닌 변수를 쓰려면 new 연산자를 써서 객체참조변수를 만들어야만 한다. 


5) 다른 클래스에 있는 static 변수를 쓸 때는 클래스 이름으로 접근한다.


public class StaticVar{

static int a;

String b;

...

}


public class StaticVarUse{

 System.out.println(StaticVar.a); //정적변수는 클래스이름으로 바로 접근

 

 StaticVar s = new StaticVar(); //멤버변수는 객체참조변수로 접근

System.out.println(s.b);



}



'공부방 > 자바프로그래밍' 카테고리의 다른 글

자바 인터페이스  (0) 2020.08.31
자바 추상화  (0) 2020.08.23
자바 다형성  (0) 2020.08.12
자바 final  (0) 2020.08.07
자바 상속  (0) 2020.07.26
자바 생성자  (0) 2020.07.20
자바 클래스와 객체  (0) 2020.07.15
자바 Method(메소드)  (0) 2020.07.13

댓글