자바에서 final 키워드는 '최종의', '마지막의' 라는 뜻을 가지고 있으며, 즉 변경 불가능함을 나타냅니다.
final class FinalEx { // 확장/상속 불가능한 클래스
final int x = 1; // 변경되지 않는 상수
final int getNum() { // 오버라이딩 불가 메서드
final int localVar = x; // 상수
return x;
}
}
변경 또는 확장 불가능한 클래스, 상속 불가
public class SubClass extends FinalEx {
// 오류 발생: Cannot inherit fromm final 'FinalEx'
}
값 변경이 불가한 상수
public class MyClass {
public static final String NAME = "Yeeun"; // 클래스 수준 상수
public final int MAX_VALUE = 10; // 인스턴스 수준 상수
public final int age; // 인스턴스 수준 상수
public void attemptToChangeFinal() {
참조 타입의 경우:
final MyClass myObject = new MyClass();는
myObject가 다른 객체를 참조하도록 변경할 수 없음을 의미합니다.
오버라이딩 불가
public calss SuperClass {
public final void showFinalMethod() {
sout("This moethod can not be overrideen");
}
}
public class SubClass extends SuperClass {
// SuperClass의 showFinalMethod를 오버라이딩 시도
@Override
public void showFinalMethod() {
// 오류 발생: cannot override showFinalMethod() in SuperClass
sout("Attempting to override a final method");
}
}
final 클래스: 다른 클래스 해당 클래스를 상속받을 수 없음
클래스의 확장을 제한하고, 불변성을 유지하려는 설계 의도에서 사용
final 필드: 필드의 값을 변경할 수 없게 만듦
상수 값을 정의하거나 객체 참조의 불변성을 보장하는 데 사용
final 메서드: 메서드가 하위 클래스에스 오버라이드하는 것을 불가하게 만듦
메서드의 구현을 고정하고, 변경을 방지하려는 설계의도에서 사용
스태틱 영역에 올라간 정보는 main() 메소드가 시작되기 전에 올라가서 main() 메소드가 종료된 후에 내려올 만큼 단단히 고정돼 있기 때문에 스태틱 영역 이라고 부릅니다.
인스턴스 변수는 해당 클래스의 인스턴스가 생성되고 GC에 의해 회수될 때까진 메모리에 유지되지만, static 변수(클래스 변수)는 프로그램이 종료될 때까지 메모리에 남아 있게 됩니다.
static 변수(클래스 변수)는 특정 클래스의 인스턴스와는 독립적으로 동작합니다. 즉, 클래스의 인스턴스가 생성되지 않아도 사용될 수 있습니다.
클래스의 인스턴스 변수는 해당 클래스의 인스턴스가 생성되어야만 사용될 수 있으며, 인스턴스 변수의 값은 해당 인스턴스에 바인딩됩니다.
이러한 차이로 인해 static 변수는 프로그램 전체에서 공유되는 전역 변수의 역할을 하면서도 클래스의 인스턴스와는 별개로 독립적으로 동작할 수 있습니다.