# final

\


## final이란?

* 상속, 변경 등을 금지하는 규제
  * 주로 불변성을 확보하기 위해 사용

\


## final의 각 선언 위치에 대한 기능

**변수** (기본형과 참조형)

* 해당 변숫값 수정 불가
* 기본형 변수: 변수가 스택에 직접 값으로 저장
  * **final 사용 시** : 값 자체가 변경될 수 없음
* 참조형 변수: 변수가 힙에 객체의 주소를 가리키는 형태로 저장
  * **final 사용 시** : 변수가 가리키는 객체의 변경은 막지만, 객체 내부의 값은 변경될 수 있음

**메소드**

* 해당 메소드 오버라이드 불가

**클래스**

* 해당 클래스 상속 불가

\


## **final 장점**

1. 스레드 동기화 문제 방지 (스레드 안정성)
   * 스레간 공유없이 안전한 공유 가능
2. 높은 코드 안정성
   * 의도치 않은 값의 변경 방지
   * 불변성이 요구되는 값의 명시적 표현 (ex. 상수)
3. 성능 최적화
   * JIT컴파일러(java 바이트 코드 → 기계어 변환시 사용)가 final필드에 대해 더 빠른 액세스 처리
     * 컴파일 시점에 이미 변수의 값을 알 수 있음
     * 메서드 호출에 따른 오버헤드를 줄일 수 있음
4. 클래스의 의도된 동작 보존 가능
   * 오버라이딩 및 상속 제한으로 클래스의 의도된 동작 보존
   * 오버라이딩을 통한 부작용 방지

⇒ 코드 가독성, 유지보수성, 안정성 향상에 기여

\


## **static final**

static 키워드를 사용하게 되면 최초 클래스를 로드할 때 메모리에 할당해 종료될 때까지 유지한다.

final 키워드와 함께 사용하게 되면 모든 인스턴스에 대해서 동일한 값을 설정하여 사용할 수 있다. 즉 상수를 뜻한다.

* final만 쓴다고 상수는 아니다. **상수는 객체마다 저장되면 안된다.(static 특징)**

하지만 JDK 1.5 버전 이후로 Enum 클래스가 등장하면서 상수 관리는 static final보단 Enum을 주로 이용한다.

> #### Enum이란?
>
> * static final 처럼 Method Area 영역에 저장.
>   * 컴파일할 때, `Java.Lang.Enum` 클래스를 상속받도록 처리됨.
> * 상수를 한 곳에 모아 관리하므로, 유지보수에 유리함
> * 상수에 필드,메서드,생성자 등을 가질 수 있어 복잡한 상수 관리 가능.

\


### Ref

* [Java Enum 활용기](https://techblog.woowahan.com/2527/)
* [상수는 왜 Static과 Final을 같이 사용할까?](https://hyojaedev.tistory.com/5)
