대상의 변경이 불가능하도록 지정
= 변경의 최종
final 변수의 대표적인 예 : java.lang.String
, java.lang.Math
-> Math.PI
: Math 클래스의 PI 상수값은 변경 불가능
변수에 final이 붙은 경우
변수 값 변경 불가
-> 저장된 값만 사용 가능
-> 상수로 취급
일반 변수와 구별을 위해 대문자 사용
단어와 단어 사이 구분은 언더스코어 사용
초기화 필수
-> 초기화 수행 하지 않은 상수 : blank final 상수
-> 생성자 통해 초기화 하면 사용 가능
-> 객체마다 다른 상수값을 갖기 위해 사용
class Member {
final int member = 10;
// final 변수는 초기화가 필수!!!
final int member;
// 초기화 안하고 선언만 했다면
public Member(int member) {
super();
this.member = member;
// 생성자를 통해서 초기화하면 됨!
// 만약에 초기화 했으면 생성자 생성 불가능!
}
public void change() {
// member = 20;
// 오류발생!!!!!
// final 붙은 변수는 값 변경이 불가능함
System.out.println(member);
// 값 변경은 불가능하지만 사용은 가능!
final int member2 = 30;
// 멤버변수뿐 아니라 로컬변수에도 final 붙을 수 있음!
// member2 = 88;
// 얘도 역시 final이 붙었기 때문에 값 변경 불가능함!
System.out.println(member2);
// 하지만 final이 붙은 멤버변수와 마찬가지로
// 값 변경은 불가능해도 사용은 가능!
}
pulbic int getMember() {
return member;
// 기존의 값을 변경은 할 수 없지만
// 사용은 가능하기 때문에 Getter 메서드 정의 가능
// 당연히 Setter 메서드는 만들 수 없음!!!
}
}
- 메서드에 final이 붙은 경우
메서드 변경 불가
-> 오버라이딩 금지
class Member {
public final void method() {
System.out.println("final 메서드");
}
pulbic void normalMethod() {
System.out.println("normal 메서드");
}
}
class Sub extends Member {
public void normal() {
super.normal();
}
// 일반 메서드만 오버라이딩 가능!
// final이 붙은 메서드는 오버라이딩이 안됨!
}
- 클래스에 final이 붙은 경우
클래스 변경 불가
-> 상속 금지
final class Member {
int num = 10;
public void method() {
}
}
// class Sub extends Member {}
// !!! 오류 발생 !!!
// class에 final 붙일 경우 상속 불가능!!!!
class Sub {
Member m = new Member();
// 상속은 불가능하지만 has-a (포함)관계 형태로 사용은 가능
public void use() {
m.num = 20;
m.method();
}
}