static

static 이란

클래스 필드 또는 메소드 앞에 static 키워드를 사용하므로서 필드, 메소드를 인스턴스의 생성없이 사용 할 수있게한다.

 

목적

모든 인스턴스가 동일 정보를 공유 해야 할때 또는 

메소드가 인스턴스의 데이터와는 상관없이 공통적인 로직이 정의될때

인스턴스마다 할당 된다면 메모리 낭비 뿐만 아니라 데이터를 참조 하거나 호출 할때마다 인스턴스를 생성해야하는등의 번거로움과 인스턴스 메모리해제에 의해 정보손실을 발생시킬 수 있다.

static 을 통하여 이러한 점들을 해결 할 수있다.

인스턴스 생성과정이 없어도 되기때문에 속도 또한 빠르다.

 

 원리

인스턴스가 생성되면 heap 영역에 할당 되어 사용되어진다. 하지만 static 키워드를 붙인 변수와 메소드는 클래스 정보가 할당되는 Method Area에 클래스가 할당 될때 같이 올라가게된다.  heap영역은 가비지 컬렉터의 영향을 받지만 Method Area의 경우 가비지컬렉터의 영향을 받지않고 메모리에 상주 할 수있게 된다.

 

 주의 사항

메모리 누수

static을 통해 메모리가 할당될 경우 클래스가 메모리상에 올라갈때 같이 올라가고 가비지 컬렉터의 영향밖에 있게때문에 프로그램이 종료 될 때까지 메모리를 회수 할 수없다.

신뢰성 하락

static은 언제 어디서든 접근 할 수있다. 그렇기에 언제 어디서 어떻게 변할지 모르는데 멀티스레드 환경에서는 더더욱 static의 상태를 예상하기 어려워진다.

 

어떨때 사용하는 것이 적절할까

상태를 저장하거나 변경하지 않는 경우에 사용하는 것이 적절하다.

예를 들면 Math.PI 에경우 final static 처리되어 상수로 사용되어지고

 Integer.parseInt() 경우 메소드 처리과정에서 어떻한 상태도 변경하지않고 단순히 입력받은 문자열을 정수로 반환 할 뿐이다.


static을 사용하면 편리하기도 하지만 전반적으로 사용을 지양하려는 의견이 많다.

관련 링크




+ Recent posts