[Java] final과 상수

🌈 m1naworld ·2022년 11월 30일
0

자바를 잡아! 👻

목록 보기
18/19
post-thumbnail

final : 초기값이 지정되면 수정 불가능 (ex. 주민등록번호)
상수: 불변의 값 (ex. 원주율 파이, 지구의 무게 둘레 등)

* final과 상수의 차이점
final 필드는 객체마다 저장되고, 생성자의 매개값을 통해 여러 가지 값을 가질 수 있으며, 상수는 객체마다 저장할 필요가 없는 공용성을 띠고 있으며, 여러 가지 값으로 초기화 될 수 없다. 상수는 final이면서 추가적으로 static이다. 상수의 이름은 모두 대문자로, 서로 다른 단어를 혼합 시엔 언더바(_)로 단어들을 연결한다.


final: the final keyword is used in several contexts to define an entity that can only be assigned once.

final 키워드는 엔티티를 한 번만 할당한다. 즉, final로 선언된 것을 재할당하려 할 때 컴파일 오류가 발생한다.

final 필드: final를 가장 많이 사용하는 곳이며 이 필드는 더 이상 수정 불가

final 메소드: 오버라이딩 금지

final 클래스: 상속 불가능

final 고려 예시

대표적인 final class는 String이 있다. String을 final로 왜 정의 하였는지는 StackOverFlow를 참고하면 Immutable object로 얻을 수 있는 이점 때문이라고 설명한다.

  1. Immutable objects
    You can share duplicates by pointing them to a single instance.

  2. Security
    The system can hand out sensitive bits of read-only information without worrying that they will be altered

  3. Performance
    Immutable data is very useful in making things thread-safe.

위의 기준들을 토대로 클래스 디자인 시 final로 선언할지 말지를 결정하면 좋을 것 같다.
또한, 만약 해당 로직에서 final로 선언하지 않은 변수는 값이 변경 되었을 때, 어디서 변경 되었는지 추적 하려면 모든 소스를 살펴보거나 확인 해야한다. 내부적으로 해당 변수가 꼭 변경 해야되는 변수만 final을 가지고 있지 않도록 하고 나머지 변수는 final을 가지고 있으면 그 변경되는 변수만 추적하면 로직을 더욱 쉽게 파악할 수 있다.

final 필드의 초기값을 줄 수 있는 방법

  1. 필드 선언시
  2. 생성자를 통한 주입

단순 값이라면 필드 선언시에 주는 것이 제일 간단하나, 복잡한 초기화 코드가 필요하거나 객체 생성시에 외부 데이터로 초기화해야 한다면 생성자에서 초기값을 지정해야 한다.

생성자는 final 필드의 최종 초기화를 마쳐야 한다. 만약 초기화되지 않은 final 필드를 그대로 남겨두면 컴파일 에러가 발생한다. ❗️즉, final로 선언된 필드를 초기화 전에 사용한다면 컴파일 에러가 발생한다.



Ref.
codechacha.com
DONGGEUN,BANG
OKKY

profile
개발자로 사는 내 삶은 즐거워 👾

0개의 댓글