자바에서 클래스나 변수에 final을 붙이면 불변의 상태로 만들 수 있다.
final String name = "홍길동";
위와 같이 final 변수를 초기화 한 후,
name = "홍박사";
이렇게 재정의할 수 없다.
...
그렇다면 final을 붙인 변수를 상수라고 부를 수 있을까?
아니다. final을 붙인 변수는 처음 초기화 되고 변하지 않을 뿐, 객체마다 다른 값을 갖기 때문에 상수라 부르지 않는다.
++ static final은 클래스에 오직 하나 존재하는 값이기 때문에 상수이다.
- 선언과 동시에 초기화
- 생성자 매개변수로 주입해서 초기화
final class A{}
위와 같이 클래스에 final을 붙이면 다른 클래스가 해당 클래스를 상속할 수 없다.
final int func(){}
위와 같이 메소드에 final을 붙이면 해당 클래스의 자식클래스에서 함수를 오버라이딩할 수 없다.
- 여러 사람이 함께 대규모 프로젝트를 진행한다고 생각해보자. A 개발자는 num이라는 변수를 선언하여 해당 변수를 값을 변경하지 않고자 했다. 하지만, B 개발자는 이 사실을 모른다.
이때, A개발자가 final을 사용함으로써 모두가 해당 변수는 불변성을 띄게됨을 알게된다. 따라서 디버깅이 쉬워지고 예상치 못한 오류 발생 가능성을 최소화할 수 있다.- 불변 객체가 됨으로써 Thread-safe하다.
멀티스레드 환경에서 공유 자원에 대해 여러 스레드가 동시 접근할 때, 동시성 문제가 발생할 수 있는데, final을 사용하면 재정의가 불가능하므로 동시성 문제를 예방할 수 있다.
참고
1. https://velog.io/@minnseong/java-final-immutable-object
2. https://kephilab.tistory.com/51