이 글에서는 자바(Java) 프로그래밍에서 자주 혼동되는 두 가지 키워드인 static과 final의 차이점을 살펴보겠습니다. 두 키워드는 모두 코드의 동작 방식과 접근성에 영향을 주지만, 그 목적과 특성은 완전히 다릅니다.
1. static 키워드란?
static은 클래스 레벨에 속하는 멤버를 정의할 때 사용하는 키워드입니다. 인스턴스 생성 없이도 클래스 이름만으로 접근할 수 있다는 것이 가장 큰 특징입니다.
static의 주요 특징
적용 대상: 중첩 클래스(nested class), 변수, 메서드, 초기화 블록(static block)에 적용할 수 있습니다.
초기화 유연성: static 변수는 선언 시점에 반드시 초기화할 필요가 없습니다.
값 재할당 가능: static 변수는 언제든지 다시 초기화(값 변경)할 수 있습니다.
접근 범위 제한: static 컨텍스트 내부에서는 해당 클래스의 정적(static) 멤버에만 직접 접근할 수 있습니다.
호출 제약: static 메서드는 다른 static 메서드에서만 직접 호출할 수 있습니다.
객체 생성 불가: static으로 선언된 중첩 클래스는 별도의 객체(인스턴스)를 생성할 수 없습니다.
멤버 구성 제한: static 클래스는 오직 정적 멤버만 포함할 수 있습니다.
용도: static 블록은 클래스 로딩 시점에 static 변수들을 초기화하는 데 사용됩니다.
2. final 키워드란?
final은 클래스, 메서드, 변수에 '변경 불가'라는 제약을 부여하는 키워드입니다. 즉, 한 번 정의된 대상은 이후 수정하거나 확장할 수 없도록 만듭니다.
final의 주요 특징
예약어(키워드): final은 자바에서 제공하는 예약어입니다.
제약 적용: 클래스, 메서드, 변수에 각각 다른 형태의 제약을 적용합니다.
상속 금지: final로 선언된 클래스는 다른 클래스가 상속할 수 없습니다.
오버라이딩 금지: final 메서드는 하위 클래스에서 재정의(오버라이딩)할 수 없습니다.
재정의 불가: final 메서드는 어떤 하위 클래스도 이를 상속하여 변경할 수 없습니다.
선언 시 초기화 필수: final 변수는 선언 시점에 반드시 값을 할당해야 합니다.
불변성 보장: 한 번 값이 설정된 final 변수는 변경하거나 다시 초기화할 수 없습니다.
3. static vs final 핵심 비교
| 구분 | static | final |
|---|---|---|
| 목적 | 클래스 레벨 멤버 정의 및 공유 | 변경·확장 방지(불변성 보장) |
| 초기화 시점 | 선언 시 초기화 필수 아님 | 선언 시 초기화 필수 |
| 값 변경 | 재할당 가능 | 재할당 불가 |
| 상속/오버라이딩 | 제약 없음 | 상속·오버라이딩 불가 |
| 대표 활용 예 | 유틸리티 메서드, 공유 카운터, Math 클래스 | 상수 정의(final static), 보안상 상속 방지 클래스(String 등) |
4. 마무리
정리하면, static은 '클래스에 소속되어 모든 인스턴스가 공유한다'는 의미이고, final은 '더 이상 변경할 수 없다'는 의미입니다. 실무에서는 두 키워드를 함께 사용해 static final 형태의 상수를 정의하는 경우가 매우 흔합니다. 두 키워드의 동작 원리를 정확히 이해하면 더 안전하고 효율적인 자바 코드를 작성할 수 있습니다.