프로그래밍에서 자주 변하지 않는 일정한 값이나 설정 정보 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해 접근하는 것이 비용도 줄이고, 효율도 높일 수 있다.
자바에는 이런 전역변수 형태의 접근을 가능하게 만들어 주는 static(정적) 이라는 키워드가 있다.
클래스의 변수나 메소드를 static으로 선언하면 그 변수는 객체의 변수가 아니라 클래스 변수가 된다. 클래스 변수이므로 어떠한 객체라도 동일한 주소로 참조하게 된다.
일반적으로 클래스의 변수나 메소드는 해당 클래스가 인스턴스화 되기 전에는 사용할 수 없는데, static 으로 선언된 변수나 메소드는 해당 클래스의 인스턴스 여부와 상관없이 바로 접근이 가능하고, 사용이 가능하다.
그럼 실무에서 적용되는 static 사용의 예로 싱글톤(Singleton)이라는 것을 살펴 보자.
public class Example {
/* object 선언 */
private static Example m_theInstance = null;
private Example() {
/* object 선언 */
private static Example m_theInstance = null;
private Example() {
}
/**
* Create and Get Instance
* applied Singleton Pattern.
*/
public static Example getInstance() {
if (m_theInstance == null)
m_theInstance = new Example();
return m_theInstance;
}
}
/**
* Create and Get Instance
* applied Singleton Pattern.
*/
public static Example getInstance() {
if (m_theInstance == null)
m_theInstance = new Example();
return m_theInstance;
}
}
생성자를 private으로 선언하면 new 로 생성할 수 없게 되고, public static 으로 선언한 getInstance() 메소드를 통해서만 객체에 접근 가능하게 만들어 준다. Singleton(싱글톤) 방식은 프로젝트에서 데이터베이스 연결등의 공용 자원 접근에 이런 방식의 static 적용하면 효율을 높일 수 있는 한 방법이 될 수 있다.
또다른 예로, 절대 변하지 않는 값을 final static으로 선언하면 GC(Gabage Collection)의 대상이 되지도 않고 클래스 로딩시 메모리에 적재되어 있으므로 효율을 높여 성능향상에 도움이 된다.
지금까지 설명한 static의 효율적인 측면과 함께 반드시 고려해야 할 면으로 static 키워드의 '전역변수'적인 성격때문에 적절하지 않게 사용하게 되면 오히려 시스템에 악영향이 되거나 심각한 오류의 원인이 될 수도 있다는 것을 고려해야 한다.
이말인 즉, 공용자원의 값은 누가 어떤때에 접근하든 일정한 값을 얻어야 하지만 해당 변수나 메소드를 의도하든 그렇지 않든 적절하지 않은 값이 저장될 수도 있다는 것이다.
애플리케이션의 디버깅 작업이나 테스트시 이런 '전역변수'적인 성격의 버그는 예상외로 찾아내기 힘들 수도 있다. 그 패턴이 일정하지 않기 때문이다.
정리하자면, 자주 변경되는 변수나 메소드에 static 키워드는 가능한한(?) 사용하지 않기를 권한다. --;
필요에 따라 static을 선언하게 되더라도 잘못된 값이 참조될 수 있는 부분은 차단하는 것이 바람직하다.
즉, 자주 변경되지 않는 부분이나 설정파일 정보인 경우 등 제한적인 용도로 사용한다면 애플리케이션 성능향상에 충분한 도움이 될 것이다.