final은 적용 대상에 따라 변경이나 확장을 제한하는 키워드입니다.

변수에 final을 사용하면 한 번만 값을 할당할 수 있습니다. 기본형 변수는 값 자체를 변경할 수 없고, 참조형 변수는 다른 객체로 참조를 변경할 수 없습니다. 다만 final 참조가 가리키는 객체의 내부 상태까지 불변이 되는 것은 아닙니다. 메서드에 사용하면 하위 클래스에서 오버라이딩할 수 없고, 클래스에 사용하면 해당 클래스를 상속할 수 없습니다.

static은 멤버를 객체가 아닌 클래스에 소속시키는 키워드입니다. static 필드는 클래스에 하나만 존재하며 모든 인스턴스가 공유합니다. static 메서드는 객체를 생성하지 않고 클래스 이름으로 호출할 수 있지만, 특정 인스턴스가 없기 때문에 this를 사용할 수 없고 인스턴스 멤버에도 직접 접근할 수 없습니다.

두 키워드를 함께 사용한 static final 필드는 클래스 전체에서 하나만 존재하면서 재할당할 수 없기 때문에 주로 상수를 표현할 때 사용합니다. 다만 참조형이라면 final만으로 객체 자체의 불변성까지 보장되는 것은 아닙니다.