2 분 소요

자바 제어자(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. 실전 활용 팁

  1. 필드는 private final + Getter로 불변 모델 구현
  2. 유틸리티 클래스public final + private 생성자로 인스턴스화 차단
  3. 상속 전제 API는 핵심 로직을 final, 확장 지점만 abstract로 분리
  4. 상수는 public static final + 대문자 스네이크(MAX_SPEED) 네이밍

질문 정리

  1. static finalfinal static 차이가 있나요?

    순서만 다를 뿐 동일하게 정적 상수를 의미합니다.

  2. abstract 클래스 대신 인터페이스를 써도 될까요?

    단일 계층 구조 또는 상태 필드가 필요 없다면 인터페이스로 대체하는 편이 유연합니다.

  3. static 메서드에서 this를 쓸 수 없는 이유는?

    static은 인스턴스와 무관한 클래스 레벨이므로 this(현재 객체 참조)가 존재하지 않습니다.

  4. final 메서드가 왜 필요하죠?

    보안·비즈니스 규칙처럼 변경되면 안 되는 핵심 로직을 하위 클래스가 임의로 바꾸지 못하도록 보호합니다.

  5. abstract 클래스에서만 추상 메서드를 선언해야 하나요?

    네. 추상 메서드는 객체를 직접 만들 수 없는 타입에서만 의미가 있으므로, abstract 키워드로 클래스도 같이 선언해야 합니다.

카테고리:

업데이트:

댓글남기기