static final 왜 같이 쓰는걸까?

twocowsong·2023년 4월 29일
0

static

static 키워드는 클래스 변수 또는 클래스 메소드를 정의할 때 사용됩니다.

final

final 키워드는 변수나 메소드, 클래스를 변경할 수 없도록 상수를 선언할 때 사용됩니다.

static final

static final 키워드를 함께 사용하는 경우에는 상수(constant)를 선언할 때 사용됩니다.
상수는 값이 변경될 수 없는 변수를 말하며, 한 번 값을 할당하면 이후에는 변경할 수 없습니다.

JVM에서 메모리 관리를 수행하는 과정에서 static final을 상수(constant)로 인식하게 됩니다.
그렇기 때문에 static final 변수는 메모리 내에 상수 풀(Constant Pool)에 저장됩니다.

상수 풀(Constant Pool)은 자바 클래스 파일 내부에 저장되는 상수들의 집합이며,
이를 통해 메모리 사용을 최적화할 수 있습니다.
상수 풀(Constant Pool)에 저장된 값들은 JVM에 의해 자동으로 메모리에서 관리되며,
GC(Garbage Collector)의 대상이 되지 않습니다.

따라서, static final 변수를 사용하면, 상수 풀(Constant Pool)에 저장되기 때문에
GC의 영향을 받지 않아 메모리 관리 측면에서 이점을 얻을 수 있습니다.


그러면, final로만 하면 상수 풀에서 관리되지 않는건가요?

final 변수는 상수로 사용될 수 있지만,
static final과 같이 사용되지 않으면 상수 풀(Constant Pool)에 저장되지 않습니다.
final 변수가 상수 풀(Constant Pool)에 저장될지 여부는 변수의 사용 방법과 컴파일러의 최적화에 따라 결정됩니다.

public class MyConstants {
  public final int MAX_SIZE = 100;
  public final String DEFAULT_NAME = "John";
}

위의 코드에서 MAX_SIZE와 DEFAULT_NAME은 final변수이지만,
static 키워드가 없기 때문에 클래스 변수가 아닙니다.
그렇기 때문에, 이러한 변수들은 객체 생성 시마다 값이 할당되며,
상수 풀(Constant Pool)에 저장되지 않습니다.

따라서, final 변수도 static과 함께 사용하면 상수(constant)로 사용할 수 있고,
상수 풀(Constant Pool)에 저장되어 GC의 영향을 받지 않을 수 있습니다.
하지만 final 변수만 사용하는 경우에는 상수 풀(Constant Pool)에 저장되지 않습니다.

profile
생각하는 개발자

0개의 댓글