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 |
댓글