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

Last updated