본문 바로가기

JAVA

[JAVA] final이란?

🏁 final 키워드

final 키워드는 "최종적인", "변경할 수 없는" 이라는 의미를 가진다. 적용 대상에 따라 그 역할이 조금씩 다르다.

1. final 변수

final 변수는 한 번 값이 할당되면 그 값을 변경할 수 없다.

  • 지역 변수: 선언 시 또는 최초 한 번만 값을 할당할 수 있고, 이후에는 변경할 수 없다.Java
  • final int x = 10; // 선언과 동시에 초기화 // 또는 final int y; y = 20; // 최초 한 번 할당 가능 // y = 30; // 컴파일 오류: final 변수는 재할당 불가능
  • 메서드 매개변수: 메서드 내부에서 해당 매개변수의 값을 변경할 수 없다. 전달받은 값이 그대로 사용된다.
  • 멤버 변수 (필드): 선언 시 또는 생성자를 통해 한 번만 값을 할당할 수 있다.
    • 인스턴스 변수에 final: new로 인스턴스가 생성될 때마다 생성자를 통해 다른 값으로 초기화될 수 있다. 인스턴스마다 고유하지만 생성 후에는 변경할 수 없는 값을 가질 때 사용된다.
  • static final 필드 (상수, CONSTANT): static과 final이 함께 붙으면 **상수(Constant)**가 된다.
    • 클래스가 로딩될 때 딱 한 번 초기화되며, 프로그램 종료 시까지 변경되지 않는 고정된 값이다.
    • 메모리 효율성: static이기 때문에 메모리에 단 하나만 존재하며 모든 곳에서 공유된다.
    • 명명 규칙: 대문자로 작성하고, 여러 단어는 언더스코어(_)로 구분하는 것이 관례다 (예: MAX_VALUE, PI).
    • 접근 방법: 클래스명.상수명으로 직접 접근한다.
    • 사용 목적: 고정된 값(예: 수학적 상수, 최대/최소값, 특정 코드 등)을 정의할 때 사용된다.

2. final 변수와 참조형 변수

final 키워드가 기본형 변수와 참조형 변수에 적용될 때의 의미가 다르다.

  • 기본형 변수(int, double 등)에 final: 변수 자체가 저장하는 을 변경할 수 없다.
  • 참조형 변수(String, 객체 등)에 final: 변수가 저장하는 **참조값(메모리 주소)**을 변경할 수 없다. 즉, 한 번 어떤 객체를 참조하도록 할당되면 다른 객체를 참조하도록 바꿀 수 없다는 의미다. 하지만, 참조하고 있는 객체 내부의 값들(필드들이 final이 아닌 경우)은 얼마든지 변경할 수 있다.
  • final StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // 가능 (참조하는 객체 내부의 값 변경) // sb = new StringBuilder("Goodbye"); // 불가능 (참조값 변경 시도)