static :
static은 '고정된 ' 이라는 의미를 가지고 있으며 static 이라는 키워드를 사용한다.
static변수(정적필드)와 static메서드(정적메서드)를 만들 수 있는데 이 둘을 합쳐 클래스 멤버 (정적멤버) 라고 한다.
정적 필드와 정적 메서드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이다.
따라, 다른 변수와 메서드는 선언을 해야 사용 가능한 것과 반대로 static 은 바로 사용할 수 있다.
Static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 Static영역에 할당된다.
Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점이 있다.
하지만, Garbage Collector의 관리 영역 밖에 존재하기에 Static영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 있게 됨으로 메모리에 영향을 줄 수 있다.
●static변수(정적필드)
class MyStatic {
int a; // heap 에 저장이 된다. 객체마다 힙 구역을 다 따로 사용 한다. 객체 생성할 떄 만들어짐
static int b;
// static 메모리에 저장 된다. 모든 객체가 공용으로 사용. 프로그램 시작할때 만들어짐
}
public class 스테틱 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("b : " + MyStatic.b);
// 객체의 유무와 상관없이 존재 한다. 객체 생성 전인데도 출력됨
// System.out.println("a : " + MyStatic.a); 객체가 생성 되지 않아 사용 불가
MyStatic ms1 = new MyStatic();
ms1.a++;
// ms1.b++;
MyStatic.b++; // static 멤버는 클래스 이름으로 하는게 좋다.
System.out.println("ms1.a : " + ms1.a);
System.out.println("ms1.b : " + MyStatic.b);
MyStatic ms2 = new MyStatic();
ms2.a++;
// ms2.b++;
MyStatic.b++;
System.out.println("ms2.a : " + ms2.a);
System.out.println("ms2.b : " + MyStatic.b);
MyStatic ms3 = new MyStatic();
ms3.a++;
// ms3.b++;
MyStatic.b++;
System.out.println("ms3.a : " + ms3.a);
System.out.println("ms3.b : " + MyStatic.b);
// static 은 모두 공용으로 사용 하기 떄문에 값이 늘어가는 것임.
}
}
위에 코드를 실행 해보면 MyStatic ms1 = new MyStatic(); / MyStatic ms2 = new MyStatic(); / MyStatic ms3 = new MyStatic(); 를 생성 하면서 int a 도 ++ staic int b 도 ++ 로 동일하게 ++ 를 주었지만 a 는 클래스가 객체가 생성 될 때마다 1인 반면 static b는 값이 점점 늘어난다. 이는 static b 는 heap 영역 밖에 있고 공용으로 사용하는 정적변수이기에 선언을 하지 않아도 사용 가능하다는 점을 보여준다.
●static메서드(정적메서드)
class StaticMathod{
int a ;
static int b;
void f1() { // 일반 메서드는 일반 멤버변수, static 변수 모두 사용 가능
System.out.println("일반메서드 f1()");
System.out.println("a : " + a);
System.out.println("b : " + b);
}
static void f2() { // static 메서드 생성
System.out.println("일반메서드 f2()"); //
// System.out.println("a : " + a); //일반변수 사용 하려니까 에러 생김
System.out.println("b : " + b);
}
void f3 () { // 일반 메서드
f1 (); //일반 메서드
f2 (); //static 매서드
}
static void f4() { // static 메서드 생성
// f1(); //static 매서드에서 일반 메서드 호출 불가.
f2();
}
}
위와 같은 성질을 이용하여 객체가 생성 될 때마다 프린트 해주는 코드를 짜보았다.
class test2 {
static int cnt ;
test2() {
cnt++;
System.out.println( cnt+"번째 객체가 생성 되었습니다");
}
}
public class StaticTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int a = 0; a <5; a++) {
new test2();
}
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 객체지향 - fianl 키워드 (0) | 2023.02.28 |
---|---|
[JAVA] 객체지향 - 초기화 블록 (0) | 2023.02.28 |
[JAVA] 객체지향 - this, this( ) (0) | 2023.02.28 |
[JAVA] 객체지향 - 메서드 오버로딩 (0) | 2023.02.28 |
[JAVA] 객체지향 - 생성자 (0) | 2023.02.28 |