final
키워드는 해당 선언이 최종 상태이고, 절대 수정될 수 없음을 의미한다.
final
키워드는 클래스, 필드, 메소드를 선언할 때 사용할 수 있는데
각 경우마다 해석이 조금씩 달라진다.
final
클래스와final
메소드는 상속과 관련이 있다.
final
클래스는 최종적인 클래스가 되므로 상속할 수 없는 클래스가 된다.
public final class McDonald {
public McDonald(int no, String branch){
this.no = no;
this.branch = branch;
}
}
public class McDonaldDT extends McDonald {
// error
}
McDonald
는 final
클래스이므로, McDonaldDT
가 상속받을 수 없다.
final
필드(변수)는 한번 초기화되면 다시 값을 변경할 수 없다.
final int value = 20;
value = 30; // error
💡 클래스 내에서 final
필드를 선언하고 초기화를 하지 않은 경우
반드시 생성자에서 초기화를 해야 한다.
클래스 내의 final
필드는 인스턴스 필드로 인스턴스마다 다른 값을 가져야 하는데,
생성 이후 그 값이 변경되지 않도록 할 때 사용한다.
public class McDonald {
private final int no; // 지점 번호(인스턴스마다 다른값, 생성 이후 값 변경 불가)
private String name; // 지점명
public McDonald(int no, String name){
this.no = no;
this.name = name;
}
public final void makeBurger(){
System.out.print("참깨빵위에순쇠고기패티두장특별한소스양상추치즈피클양파까지");
}
final
메소드는 최종적인 메소드가 되므로 재정의할 수 없는 메소드가 된다.
즉, 부모 클래스를 상속받은 자식 클래스에서 부모 클래스에 선언된 final
메소드는
자식 클래스에서 재정의할 수 없다.
public class McDonaldDT extends McDonald {
public McDonaldDT(int no, String name){
super(no, name);
}
// error
@Override
public void makeBurer(){
...재정의할 수 없음...
}
}
static final
은 주로 상수(constant)를 정의할 때 사용되며,
static
과 final
키워드의 조합으로 이루어져 있다.
1. static
변수(필드)나 메소드 클래스에 속한다.
클래스에 속하기 때문에, 해당 변수나 메서드는 모든 인스턴스가 공유한다.
따라서 인스턴스를 생성하지 않고 클래스 이름을 통해 접근 가능하다.
static
변수는 클래스 로드 시점에 초기화되며, 프로그램 종료 시까지 유지된다.
2. final
변수나 메소드가 더 이상 변경할 수 없도록 한다.
final
은 한 번만 초기화할 수 있으며, 그 이후에는 값이 변경되지 않는다.
3. static final
클래스 레벨에서 정의된 상수로, 클래스가 로드될 때 초기화 되며 이후에 변경할 수 없다.
모든 인스턴스가 동일한 상수 값을 공유한다.
💡 static
과 final
은 각각 클래스, 메서드, 필드(변수)에 적용될 수 있지만
static final
은 필드(변수)에만 한정된다.
static
키워드는 일반 클래스에서 사용할 수 없지만
내부 클래스(중첩 클래스)에서는 사용할 수 있다.
static
내부 클래스는 외부 클래스의 인스턴스와 독립적으로 사용할 수 있으며,
외부 클래스의 인스턴스 없이 생성할 수 있다.
static
필드는 클래스 레벨에서 정의되며, 모든 인스턴스가 공유하는 변수다.
클래스에 속하는 변수로 인스턴스를 생성하지 않고도 접근할 수 있다.
static
메서드는 클래스 레벨에서 정의되며, 인스턴스 없이 호출할 수 있다.
final
: 인스턴스 레벨에서 정의, 각 인스턴스마다 고유한 값을 가질 수 있다.static final
: 클래스 레벨에서 정의, 모든 인스턴스가 동일한 값을 공유한다.final
: 생성자에서 초기화, 이 경우 인스턴스마다 다른 값을 가진다.static final
: 클래스 로드 시점에 한 번만 초기화, 초기화된 이후 값이 변경되지 않는다.final
: 인스턴스별로 상수화된 값을 가지게할 때 사용한다.static final
: 모든 인스턴스가 공유하는 상수를 정의할 때 사용한다.