final 키워드
- 대상의 변경이 불가능하도록(변경의 최종) 지정
- 변수에 final이 붙을 경우 => 변수 값 변경 불가 = 저장되어 있는 값만 사용 가능 = 상수로 취급됨 => 일반 변수와 구별하기 위해 이름을 보통 대문자로 사용하며, 단어와 단어 사이의 구분은 언더스코어(_)를 사용함 ex) MAX_NUM => 반드시 초기화 필수! 단, 초기화를 수행하지 않는 상수를 blank final 상수라고 하며 생성자를 통해 초기화하면 사용 가능함 => 목적 : 객체마다 다른 상수 값을 갖기 위함
- 메서드에 final이 붙을 경우 => 메서드 변경 불가 = 오버라이딩 금지!
- 클래스에 final이 붙을 경우 => 클래스 변경 불가 = 상속 금지!
// final 변수의 대표적인 예 : Math 클래스의 PI상수
System.out.println("PI값 : " + Math.PI); // static final이 붙어있는 함수
// => Math 클래스의 PI 상수값은 변경 불가
Math.PI = 3.14; // 컴파일 에러 발생! 값 변경 불가!
// => The final field Math.PI cannot be assigned : 할당되지 않은 주소
} //main() 메서드 끝
} // Ex 클래스 끝
1. 변수에 final 키워드를 사용할 경우
class FinalMember {
// final 상수는 반드시 초기화 필요!
final int finalMember = 10;;
// 만약, final 상수를 초기화하지 않을 경우
final int blankFinalMember; // 컴파일 에러 발생!
// => 단, 생성자를 통해 초기화하는 경우 사용이 가능하다!
// alt shift s o
public FinalMember(int blankFinalMember) {
super();
this.blankFinalMember = blankFinalMember; // blank final 상수 초기화
}
public void change() {
// finalMember = 99; // final 키워드가 붙은 변수(=상수)는 값 변경 불가!
// => 오류 발생! The final field FinalMember.finalMember cannot be assigned
System.out.println("finalMember : " +finalMember);
final int finalLocalVar; // 로컬변수에도 final 키워드 사용 가능
finalLocalVar = 99; // 값 변경 불가
}
// 기존 값 변경은 불가능하지만 사용은 가능
// alt shift s r
public int getFinalMember() {
return finalMember;
}
}
2. 메서드에 final 키워드를 사용할 경우
class FinalMethod {
public final void finalMethod() { // final 메서드 = 오버라이딩 불가
System.out.println("슈퍼클래스의 finalMethod()");
}
public void normalMethod() {
System.out.println("슈퍼클래스의 normalMethod()");
}
}
// FinalMethod 클래스를 상속받는 SubFinalMethod 클래스 정의
// => 메서드 오버라이딩
class SubFinalMethod extends FinalMethod {
// final 메서드를 오버라이딩 할 수 없으므로 컴파일 에러 발생!
// => Cannot override the final method from FinalMethod
@Override
public void finalMethod() {
System.out.println("서브클래스에서 오버라이딩 된 finalMethod()");
}
// alt shif s v
@Override
public void normalMethod() {
System.out.println("서브클래스에서 오버라이딩 된 normalMethod()");
finalMethod(); // 오버라이딩은 안되지만 호출은 가능함(재정의 할 수 없을 뿐, 사용은 가능)
}
3. 클래스에 final 키워드를 사용할 경우
final class FinalClass { // final 클래스 = 상속 불가
int num = 10;
public void method() {
System.out.println("슈퍼클래스의 method()");
}
}
// FinalClass 클래스를 상속받는 SubFinalClass 정의
//class SubFinalClass extends FinalClass { } // 컴파일 에러 발생!
// => The type SubFinalClass cannot subclass the final class FinalClass
// => final 키워드가 붙으면 final 클래스를 상속받을 수 없다!
class SubFinalClass {
// final 클래스는 상속관계(is-a) 형태로 사용이 불가능하지만
// 포함관계(has-a) 형태로 인스턴스를 생성하여 사용은 가능함.
FinalClass fc = new FinalClass();
}
FinalClass fc = new FinalClass();
SubFinalClass sfc = new SubFinalClass();
sfc.fc.num = 20;
sfc.fc.method();
//final 클래스는 상속은 불가능하지만 사용은 가능
String str = new String();
} // main() 끝
'JAVA' 카테고리의 다른 글
[JAVA] 예제로 알아보는 인터페이스(Interface) ① (0) | 2023.10.10 |
---|---|
[JAVA] 레퍼런스 형변환에 대해 알아보자 (0) | 2023.09.26 |
[JAVA] 상속에서의 상속자 (0) | 2023.09.19 |
[JAVA] 레퍼런스 super와 접근제한자 (0) | 2023.09.19 |
[JAVA] 메서드 오버라이딩(Method Overriding)과 예제 (0) | 2023.09.18 |