ㅇ static 변수는 해당 static변수가 선언된 클래스의 모든 인스턴스가 공유하는 변수이다.

 

ㅇ static 으로 선언된 변수는 특정 메모리 공간 하나의 주소에 존재한다. (동일한 주소로 변수 참조)

   - 다시말해, 여러번 생성 될 때 마다 메모리에 로딩되지 않고 한번만 한 곳에 로딩된다.

 

ㅇ static 변수는 객체가 생성(new)되기 전에 별도의 메모리 공간에 할당되어 초기화 된다.

 

ㅇ static 변수는 클래스가 생성(new)되지 않더라도 정의만 되어도 접근가능하다.

 

ㅇ static 변수가 초기화 되는 시점은 JVM에 의하여 클래스가 메모리 공간에 올라가는 순간이다.

   - 일반 변수는 객체가 new되는 시점에 메모리에 로딩된다는 점과 차이
   - static변수는 생성자를 통하여 초기화 하면 안됨

 

ㅇ 객체간 데이터 공유가 필요한 상황에서는 static변수를 선언한다.

 

ㅇ 클래스 내부/외부에서 참조의 용도로만 선언된 변수는 static final로 선언된다.

 

ㅇ static 메소드 내에서는 일반 객체 변수를 사용할 수 없다.
   - static 메소드를 호출할 때 객체가 생성되어 있지 않을수도 있기 때문이다.
   - 다시말해, new되어 변수가 메모리에 로딩되지 않은 시점 일 수도 있다는 말이다.

 

ㅇ static변수는 지속적으로 메모리에 유지된다.
   - 일반 변수는 메소드에서 사용되고 나면 자동으로 소멸되는것과 비교

 

ㅇ static 메소드는 컴파일시 early-binding되기 때문에 실행시 바인딩(late-binding)되는 객체 메소드 보다 빠르다.
   - 컴파일시 이미 호출될 함수가 결정되기 때문에 실행시에 호출되는 함수를 찾아서 결정하는 시간을 줄일 수 있다.

 

자주 변하지 않는 일정한 값이나 설정 정보 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어 들이는것 보다 일종의 메모리 차지공간도 줄이고 효율도 높일 수 있다.

static으로 선언된 클래스 변수나 메소드는 객체의 변수가 아니라 클래스의 변수가 된다.
클래스의 변수라 함은 어떠한 객체라도 동일한 주소로 해당 변수를 참조할 수 있다.
반대로 객체의 변수라고 하면 매번 new될때 마다 참조 주소가 달라진다.

일반적으로 클래스의 변수나 메소드는 클래스가 인스턴스화(new) 되기 전에는 사용 할 수 없는데
static으로 선언된 변수나 메소드는 해당 클래스의 인스턴스 여부와 상관없이 바로 접근/사용가능

 

싱글톤(singleton)
클래스를 private로 선언하면 클래스 객체를 new로 생성할 수 없다.
public static으로 선언한, 객체를 리턴하는 getInstance()와 같은 메소드를 통해서만 객체 접근 가능
public static MyClass getInstnace()
{
if(classInstance == null)
classInstance = new MyClass();
return classInstance;
}

싱글톤 방식은 프로젝트에서 DB연결 등의 공용자원 접근에 이런 static적용을 통해 안전성을 높임
변하지 않는 값을 final static으로 선언하면 GC(Gabage Collection) 대상이 되지 않음

 

 

by wisegirl 2013. 3. 14. 17:24