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