반응형
static
클래스를 만들고 객체를 생성하면 객체마다 객체변수를 저장하기 위한 메모리가 별도로 할당된다.
➡️ 데이터 메모리의 정의
하지만 객체의 값이 변하지 않는 경우라면 static 변수를 이용해 이를 고정시킨다.
static 멤버는 static 메모리에 저장된다.
즉, 모든 객체가 하나의 static 메모리를 공용으로 사용한다. 이는 프로그램 시작 시 만들어지며, 0으로 자동 초기화된다.
(같은 메모리 안에 객체 여러개 생성)
static 은 클래스 소속이기 때문에 "클래스.메서드()"로 호출한다.
class StaticTest {
static int test;
}
Main {
test.a = 10;
}
객체 생성없이 사용이 가능하다.
static 변수를 사용하는 이유는, 객체의 값이 변하지 않는 경우 여러 객체가 하나의 메모리를 참조하도록 해 메모리 효율을 높이기 위함이다.
static 정리
- 객체 값이 변하지 않는 경우에 사용
- 모든 객체가 하나의 메모리를 공용 사용
- 프로그램 시작시 객체 생성, 따로 생성없이 사용 가능
- 객체 0으로 자동 초기화
class Test {
int a; //일반 멤버변수, heap 에 저장
static int b; // static 멤버, static 메모리에 저장
}
Test t1 = new Test();
Test t2 = new Test();
Test t3 = new Test();
//heap 에 테스트 객체 3개가 만들어진다. 각 객체는 멤버변수
클래스 소속 : class
t1.a = 1;
t2.a = 2;
t3.a = 3;
Test.b = 30; // static 멤버변수에 30이 고정
static 문제
Q 객체가 생성될 때마다 "몇번째 객체 생성됨" 메세지 출력
class Test {
static int cnt;
cnt ++;
System.out.println (cnt + "번째 객체가 생성되었습니다.");
}
main {
for (int i=0; i<5; i++) {
new Test2();
}
}
static 메서드
일반 메서드에서는 static 변수 사용이 가능하지만 static 메서드에서는 일반 멤버변수는 사용이 불가능하다.
객체 생성 전에 메서드를 호출할 수 있기 때문이다. 즉, static 메서드는 객체 생성 유무를 따지지 않기 때문에 둘 다 사용이 가능하다.
class StaticMethod {
int a;
static int b;
//일반 메서드는 모두 사용 가능
void f1() {
System.out.println ("일반 메서드, f1()");
System.out.println("a:" + a);
System.out.println("b:" +b);
}
// static 메서드는 일반 멤버 변수 사용 불가
static void f2() {
System.out.println("static 메서드. f2()");
// System.out.println("a:"+a);
// 객체 생성 전에 이 메서드를 호출할 수 있기 때문에 사용 불가
System.out.println("b:"+b);
}
void f3(){
f1(); //일반 메서드
f2(); //static 메서드
}
void static f4(){
// f1(); //일반 메서드. 호출 불가
f2(); //static 메서드
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// 객체 생성 전
System.out.println("static 멤버만 사용 가능");
StaticMethod.f2();
StaticMethod.f4();
System.out.println(StaticMethod.b);
// 객체 생성 후
System.out.println("일반 멤버, static 멤버만 사용 가능");
StaticMethod sm = new StaticMethod();
System.out.println(sm.a);
System.out.println(StaticMethod.b);
sm.f1();
StaticMethod.f2();
sm.f3();
StaticMethod.f4();
}
반응형