final
final이란?
상속, 변경 등을 금지하는 규제
주로 불변성을 확보하기 위해 사용
final의 각 선언 위치에 대한 기능
변수 (기본형과 참조형)
해당 변숫값 수정 불가
기본형 변수: 변수가 스택에 직접 값으로 저장
final 사용 시 : 값 자체가 변경될 수 없음
참조형 변수: 변수가 힙에 객체의 주소를 가리키는 형태로 저장
final 사용 시 : 변수가 가리키는 객체의 변경은 막지만, 객체 내부의 값은 변경될 수 있음
메소드
해당 메소드 오버라이드 불가
클래스
해당 클래스 상속 불가
final 장점
스레드 동기화 문제 방지 (스레드 안정성)
스레간 공유없이 안전한 공유 가능
높은 코드 안정성
의도치 않은 값의 변경 방지
불변성이 요구되는 값의 명시적 표현 (ex. 상수)
성능 최적화
JIT컴파일러(java 바이트 코드 → 기계어 변환시 사용)가 final필드에 대해 더 빠른 액세스 처리
컴파일 시점에 이미 변수의 값을 알 수 있음
메서드 호출에 따른 오버헤드를 줄일 수 있음
클래스의 의도된 동작 보존 가능
오버라이딩 및 상속 제한으로 클래스의 의도된 동작 보존
오버라이딩을 통한 부작용 방지
⇒ 코드 가독성, 유지보수성, 안정성 향상에 기여
static final
static 키워드를 사용하게 되면 최초 클래스를 로드할 때 메모리에 할당해 종료될 때까지 유지한다.
final 키워드와 함께 사용하게 되면 모든 인스턴스에 대해서 동일한 값을 설정하여 사용할 수 있다. 즉 상수를 뜻한다.
final만 쓴다고 상수는 아니다. 상수는 객체마다 저장되면 안된다.(static 특징)
하지만 JDK 1.5 버전 이후로 Enum 클래스가 등장하면서 상수 관리는 static final보단 Enum을 주로 이용한다.
Enum이란?
static final 처럼 Method Area 영역에 저장.
컴파일할 때,
Java.Lang.Enum
클래스를 상속받도록 처리됨.상수를 한 곳에 모아 관리하므로, 유지보수에 유리함
상수에 필드,메서드,생성자 등을 가질 수 있어 복잡한 상수 관리 가능.
Ref
Last updated