개념
static
: 클래스 단위 공유 변수
여러 객체가 동일한 값을 사용해야 할 때, 메모리 낭비를 줄이고 전역 접근성, 일관성을 높이기 위해 사용한다.
apiUrl이나 timeout 등의 Config 설정값 들이나 유틸리티 메서드 등에 사용하게되는데, 일관성도 보장되는 장점이 있다.
final
: 한 번만 할당 가능한 상수
의도치 않은 재할당을 막고 불변성을 보장해, 코드의 안정성과 예측 가능성을 높이기 위해 사용한다.
예를 들어, 결제 객체를 생성하는 경우에 인스턴스가 생성될 때 생성자에서 결제 ID가 한번 생성된 이후에는 어떤 경우에도 변경되지 않고 ID가 유지되어야 한다. 결제 ID를 final을 통해 한번만 초기화 가능하고 변경하지 않을 값이라는 것을 강제할 수 있다.
컴파일러 수준에서의 변경이 불가능한 값임을 강제한다.
static final
: 클래스 단위 상수 (전역 상수)
모든 객체가 동일한 상수를 참조해야 할 때 사용. 중복 초기화를 막고, 코드 의미를 명확히 하기 위해 사용한다.
어플리케이션 전역에서 사용할 상수값을 정하기 위해 사용하는데, 예시로 최대 연결 수, 단위 변환 비율, API 버전 등이 있다. 예시의 값들은 객체마다 복제해서 낭비할 필요도 없고 변경될 수 있는 가능성을 남겨둘 필요도 없다.
비교
| 구분 | 선언 예시 | 의미 | 메모리 위치 | 변경 가능성 | 초기화 시점 |
|---|---|---|---|---|---|
static | static int count; | 클래스 단위 공유 변수 | Method Area | 가능 | 클래스 로딩 시 |
final | final int id; | 한 번만 할당 가능한 상수 | Heap (객체마다) | 불가능 | 생성자 내에서 가능 |
static final | static final int LIMIT = 10; | 클래스 단위 상수 (전역 상수) | Method Area | 불가능 | 클래스 로딩 시 |