static 제대로 사용하기

📌 static?

'정적인, 움직이지 않는'이라는 의미를 가진다. 자바에서 메서드나 변수는 static를 붙이면 정적인 의미를 가진다.

클래스 변수

static으로 선언한 변수를 말한다. 클래스 변수는 말 그대로, 객체가 사용하는 것이 아닌 클래스가 사용하는 변수를 말한다. 모든 객체가 동일한 주소를 참조하므로, 공용으로 사용할 수 있다.
public class Test { public static String classVariable; ... }
Java

static 초기화 블록

클래스가 최초 로딩될 때 수행된다. 따라서 생성자의 실행과 상관없다. 아래 코드와 같이 여러번 수행도 가능하다. 마지막에 할당된 값이 저장되므로 아래 변수는 "클래스 변수2"로 초기화되어 있다.
public class Test { public static String classVariable; static { classVariable = "클래스 변수"; } static { classVariable = "클래스 변수2"; } ... }
Java

📌 static 활용하기

자주 사용하면서 변경되지 않는 것들은 상수로

주로 상수는 final static으로 아래와 같이 사용한다. final 키워드가 붙으면 재할당이 불가능하기 때문에 변경되지 않는 것은 final static으로 상수로 만들어주자.
public class Test { public final static String classVariable = "클래스 변수"; ... }
Java

설정 파일 정보도 static으로 관리하자

많은 설정파일이 존재하는데 클래스 객체를 생성할 때마다 설정 파일을 로딩하면 많은 성능 저하가 일어나게 된다. static으로 관리하게 되면 클래스가 로딩될 때 한 번만 가져와서 사용하면 되므로, static으로 관리하면 좋다.

📌 static을 잘못쓰면 어떻게 될까?

GC의 대상이 되지도 않는다. 따라서 성능 이슈가 될 수 있다.(메모리 릭)
웹 환경에서 static을 잘못 사용하면, 여러 쓰레드로 인해 동기화에 대한 문제가 생길 수 있다.

static & 메모리 릭(Memory Leak)

Collection 객체를 static으로 선언하면, 데이터가 계속 쌓일 수 있다. GC 대상이 되지도 않기 때문에 OutOfMemoryError가 발생할 수 있다. 따라서 static과 Collection 객체는 주의해서 사용하자.
💡
메모리 릭(Memory Leak)? 더 이상 사용 가능한 메모리가 없어지는 현상을 메모리 릭이라고 한다.
메모리 릭은 HeapDump 파일을 통해 메모리의 현재 상태를 알 수 있다. JDK/bin 디렉토리에 있는 jmap이라는 파일을 사용하여 덤프를 남길 수 있다. 그리고 툴을 이용하여 분석하면 된다.

📌 마무리

static을 이용해서 성능을 향상 시킬 수 있었지만, 어떤 문제들이 있는지 모르고 사용해왔던거 같다. 앞으로는 그냥 사용하지 않고, 어떤 이슈가 있는지 어떤 장점이 있는지 충분히 파악한 다음에 사용해야겠다고 느꼈다. 모르면 아예 사용하지 않는 것이 안전하겠다.

📌 참고 자료

TOP