9.27 10-2 정적멤버변수 vs 인스턴스형멤버변수
멤버변수는 크게 정적멤버 변수와 인스턴스형 멤버변수로 나눈다
멤버메소드도 정적메소드 와 인스턴스형 메소드로 나눈다.
멤버변수나 멤버 메소드 앞에 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