final 키워드는 변수, 메소드, 클래스를 선언할때 사용할 수 있다.
final 키워드가 어디에 쓰이느냐에 따라 해석이 조금씩 달라지는데, 특징이 있다면
final 키워드가 붙으면 제한을 건다는 것이다.
상수, 리터럴 값을 설정하려면 변수에 final이 쓰인다. 즉, final이 붙은 변수는 더이상 값을 변경할 수 없다.
클래스 선언할 때 final 키워드를 붙이면 이 클래스는 최종적인 클래스이므로 더이상 부모 클래스가 될 수 없다. 즉, 클래스 자체가 최종 클래스가 되는 것이다.
'여기에서 대를 끊을래'와 같은 의미이다.
형식
public final class 클래스명{ ... }
우리가 마치 기본형처럼 사용하지만 첫글자가 대문자로 시작하는 String타입도 사실 final 클래스이다.
확인해보자!
코드
package myPractice;
public final class FinalClassPra {
public int i = 1;
}
package myPractice;
public class FinalClass extends FinalClassPra {
}
FinalClassPre cannot be resolved to a type
메소드를 선언할때 final 키워드가 붙으면 어떻게 될까?
이 메소드는 최종 메소드가 되어 오버라이딩 할 수 없는 메소드가 된다.
형식
public final 리턴타입 메소드(){...}
코드
FinalClassPra
public class FinalClassPra {
public int speed;
public void go() {
System.out.println("주행중");
speed++;
}
public final void stop() {
System.out.println("브레이크");
speed = 0;
}
}
FinalClass
public class FinalClass extends FinalClassPra {
@Override
public void go() {
// TODO Auto-generated method stub
super.go();
}
@Override // 오류
private void stop() {
// TODO Auto-generated method stub
}
}
Cannot override the final method from FinalClassPra
단어 자체 의미인 '최종'의 의미는 변하지 않는다.
final 키워드가 쓰인 멤버라면, 변하지 않을 것이라는 낙인이 찍힌 코드라고 생각하자.
앞서 다른 접근 제한자는 정리를 했다.
오늘 정리할 protected는 상속과 연관이 있기에 상속을 배운 지금, 정리를 해보고자 한다.
같은 패키지에서 default와 같이 접근 제한이 없지만 다른 패키지에서 자식 클래스만 접근이 허용되는 접근 제한이다.