static
- static 키워드를 가진 멤버변수(클래스변수)나 메소드는 어디서든지 접근 가능하다. = (메모리 상주 키워드)
- static 메소드에서는 static 멤버변수나 static 메소드만 호출 가능하다.
- static 메소드에서는 non-static 메소드에 접근할 때 인스턴스화(객체화 = 메모리 할당)시켜야 접근이 가능하다.
static 키워드를 사용하는 경우
- 일반적인 메소드에는 static 을 붙이지 않는다.
- 지역변수에는 static 변수를 선언할 수 없다.
- static 메소드 내부에서 static 변수를 선언할 수 없다.
- non-static 메소드 내부에서 static 변수를 선언할 수 없다.
- static 변수는 공용변수라고 한다. → 판매 누적, 방문자수 누적 등의 변수에 사용!
- 예) 게시판 글 방문자수 - 계속 누적되어야 하는 변수. 어떤 경로를 통해 접근하든 누적된 값을 가지고 있어야 한다.
- 인스턴스 자동초기화를 개발자가 작업
- heap영역(인스턴스 영역)에 메모리를 한 번 잡아두고 계속 사용하고 싶을 때 사용
public class StaticTest {
public static void main(String[] args) {
StaticTest pc = new StaticTest();
pc.printChar('*', 30);
System.out.println("안녕 자바!~");
pc.printChar('*', 30);
}
void printChar(char ch, int num) {
for (int cnt=1; cnt<num; cnt++) {
System.out.print(ch);
}
System.out.println();
}
}
정적 초기화 블럭 static {}
- 클래스가 사용되기 전에 JVM에 의해 단 한번 호출(실행)되게 하고 싶을 때 사용
- 정적 필드(변수)의 초기화 설정에 주로 사용된다. → 누구나 언제 어디서든 접근 가능하도록!
public class StaticBlock {
static int[] arr;
static {
arr = new int[100];
for (int i=0; i<100; i++) {
arr[i] = i+1;
}
}
public static void main(String[] args) {
System.out.println(StaticBlock.arr[34]);
System.out.println(StaticBlock.arr[97]);
System.out.println(StaticBlock.arr[12]);
}
}