static은 자바의 경우 JVM이 프로그램을 실행할 때 static영역의 메모리에 클래스의 정보가 로딩될 때 할당되고 프로그램이 종료할 때 할당 해제된다. heap 메모리 영역에 할당되는 instance와 다르게 GC에 의해 관리되지 않기 때문에(GC는 생명주기에 의해 사용을 안하는 heap 메모리를 자동으로 할당 해제한다.) 프로그램 실행 내내 메모리에 할당된 채 존재를 하기 때문에 과용하게 되면 시스템 성능에 악영향을 미칠 수 있다. 추가로 멀티 쓰레드 환경에서는 공유 메모리 자원에 대한 안정성 문제도 static을 사용할 때 주의해야 되는 점이다.
클래스가 메모리에 올라갈 때 자동으로 생성되는 static method는 인스턴스를 생성하지 않아도 바로 사용이 가능하지만 대신 method 내부에 인스턴스 변수를 사용해서는 안된다. 또 다른 특징으로 instance method의 경우 생성된 instance마다 메모리 공간이 할당되지만 static은 하나의 메모리 공간이 할당 되고 모든 instance에서 해당 메모리 공간을 공유가 가능하다는 점이다.
static block은 클래스가 처음 로딩될 때 한 번만 수행되는코드를 감싸는 block 이다.
class Person {
String name = "";
int age = 0;
static {
System.out.printIn("사람 클래스 로딩");
}
Person() {
System.out.printIn("홍길동 인스턴스 생성");
name = "홍길동";
age = 19;
}
Person(String name, int age) {
System.out.printIn(name+"인스턴스 생성");
this.name = name;
this.age = age;
}
public static void main(String[] args) {
new Person();
new Person("영희",19);
}
}
실행결과
사람 클래스 로딩
홍길동 인스턴스 생성
영희 인스턴스 생성
instance block은 인스턴스가 생성될 때 마다 호출이 되고 생성자보다 먼저 수행이 되는 코드이다. 보통은 생성자 내부에 코드를 작성하지만 생성자마다 공통으로 실행해야 되는 코드에 사용하면 오버로딩 되는 생성자 내부의 코드 중복을 방지할 수 있다.
class Person {
String name = "";
int age = 0;
{System.out.printIn("사람 생성");}
Person() {
name = "홍길동";
age = 19;
}
Person(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
new Person();
new Person("영희",19);
}
}
실행결과
사람 생성
사람 생성