자바 final·static·abstract 제어자 변경 불가·공유 멤버·추상 설계
자바 제어자(Modifier) 중에서도 final·static·abstract는 클래스·메서드·필드의 동작과 제약을 좌우하는 핵심 키워드입니다. 이 글에서는 세 제어자의 의미-차이-조합 규칙을 예제 코드와 함께 쉽고 명확하게 정리했습니다.
1. final ― 변경 불가 선언
1-1. final 클래스
- 상속 불가로 설계를 고정
final class Car { /* ... */ }
// class SportCar extends Car {} // ❌ 컴파일 오류
1-2. final 메서드
- 오버라이딩 금지 → 하위 클래스에서 동작 일관성 유지
class Vehicle {
final void start() { System.out.println("Start!"); }
}
1-3. final 필드 & 지역 변수
- 상수(immutable) — 한 번 초기화 후 값 변경 불가
class Config {
final int MAX_SPEED = 120; // 선언과 동시에 초기화
}
2. static ― 클래스 공통 멤버
2-1. static 필드
- 모든 인스턴스가 동일 값 공유
class Counter {
static int total; // 클래스 로딩 시 1회 생성
}
2-2. static 메서드
- 인스턴스 없이 호출 가능,
this사용 불가
class MathUtil {
static int square(int n) { return n * n; }
}
2-3. static 초기화 블록
- 클래스 로딩 시 딱 한 번 실행
class InitDemo {
static { System.out.println("클래스 최초 로딩!"); }
}
3. abstract ― 추상 설계와 강제 구현
3-1. 추상 클래스
- 미완 메서드 + 완성 메서드 혼합 가능, 직접 인스턴스화 불가
abstract class Vehicle {
abstract void move(); // 구현 강제
void stop() { System.out.println("STOP"); }
}
3-2. 추상 메서드
- 선언만 작성 → 자식 클래스에서 반드시 구현
class Car extends Vehicle {
@Override void move() { System.out.println("Drive"); }
}
4. 제어자 조합 규칙 ⚖️
| 대상 | 허용 조합 | 금지 조합 & 이유 |
|---|---|---|
| 클래스 | public, (default), final, abstract |
final abstract → 상속 금지 vs 상속 필요 |
| 메서드 | public/private/protected, final, static, abstract |
abstract static, abstract private |
| 필드 | public/private/protected, final, static |
abstract 사용 불가 |
5. 실전 활용 팁
- 필드는
private final+ Getter로 불변 모델 구현 - 유틸리티 클래스는
public final+private생성자로 인스턴스화 차단 - 상속 전제 API는 핵심 로직을
final, 확장 지점만abstract로 분리 - 상수는
public static final+ 대문자 스네이크(MAX_SPEED) 네이밍
질문 정리
-
static final과final static차이가 있나요?순서만 다를 뿐 동일하게 정적 상수를 의미합니다.
-
abstract클래스 대신 인터페이스를 써도 될까요?단일 계층 구조 또는 상태 필드가 필요 없다면 인터페이스로 대체하는 편이 유연합니다.
-
static메서드에서this를 쓸 수 없는 이유는?static은 인스턴스와 무관한 클래스 레벨이므로this(현재 객체 참조)가 존재하지 않습니다. -
final메서드가 왜 필요하죠?보안·비즈니스 규칙처럼 변경되면 안 되는 핵심 로직을 하위 클래스가 임의로 바꾸지 못하도록 보호합니다.
-
꼭
abstract클래스에서만 추상 메서드를 선언해야 하나요?네. 추상 메서드는 객체를 직접 만들 수 없는 타입에서만 의미가 있으므로,
abstract키워드로 클래스도 같이 선언해야 합니다.
댓글남기기