[Java] 예약어 final 정리
final 예약어를 예제와 함께 알아보자.
- 순서 -
1. 클래스에 final이 붙으면?
2. 메소드에 final이 붙으면?
- 변수에 final이 붙을 때 공통 -
3. 클래스 변수에 final이 붙으면?
4. 인스턴스 변수에 final이 붙으면?
5. 지역 변수에 final이 붙으면?
6. 매개 변수에 final이 붙으면?
7. 변수가 참조 자료형일 때 final이 붙으면?
--------------------------------------------------------------------------
1. 클래스에 final이 붙으면?
final class SuperClass {
}
public class SubClass extends SuperClass { // 에러가 난다.
}
상속되지 않는다. 즉 더는 상속이 되지 않아야 하는 클래스에 붙이면 된다.
가까운 예로 String 클래스를 까보면 final이 붙어있는 것을 볼 수 있다.
--------------------------------------------------------------------------
2. 메소드에 final이 붙으면?
class SuperClass {
final void test(){}
}
public class SubClass extends SuperClass {
void test(){} // 에러가 난다.
}
오버라이딩 되지 않는다. 즉 부모의 메소드를 재정의 하지 못하게 막는 것이다.
class SuperClass {
final void test(){}
final void test(int number){}
}
오버로딩은 잘 된다.
--------------------------------------------------------------------------
- 변수에 final이 붙을 때 공통 -
% 변수에 final이 붙으면 초기화를 한 후에는 변경할 수 없다는 것을 알아두고 아래 내용을 읽자 %
final int variable = 1;
variable = 2; // 에러
--------------------------------------------------------------------------
3. 클래스 변수에 final이 붙으면?
public class FinalTest {
final static int variableA = 1; // 정상
final static int variableB; // 에러
}
클래스 변수는 선언과 동시에 초기화를 하지 않으면 에러가 난다.
--------------------------------------------------------------------------
4. 인스턴스 변수에 final이 붙으면?
public class FinalTest {
final int variableA = 1; // 정상
final int variableB; // 에러
}
클래스 변수와 마찬가지로 선언과 동시에 초기화를 하지 않으면 에러가 나지만 생성자에 초기화를 해주면 에러가 나지 않는다.
public class FinalTest {
final int variableA = 1; // 정상
final int variableB; // 에러나지 않음
SubTest(){
variableB = 2;
}
}
--------------------------------------------------------------------------
5. 지역 변수에 final이 붙으면?
public class FinalTest {
void method(){
final int variableA = 1; // 정상
final int variableB;
variableB = 2; // 정상
}
}
지역 변수는 메소드 안에서만 참조되므로 언제 초기화하는지 중요하지 않다.
--------------------------------------------------------------------------
6. 매개 변수에 final이 붙으면?
public class FinalTest {
void method(final int variable){
variable = 2; // 에러
}
}
매개 변수는 이미 초기화가 되어서 넘어왔기 때문에 초기화 할 필요가 없다. 따라서 값을 다시 선언해주면 에러가 난다.
--------------------------------------------------------------------------
7. 변수가 참조 자료형일 때 final이 붙으면?
public class FinalTest {
void method(){
final OtherClass otherClass = new OtherClass();
otherClass.a = 2; // 정상
otherClass.b = 1; // 에러
otherClass = new OtherClass(); // 에러
}
}
class OtherClass {
int a = 1;
final int b = 2;
}
참조 자료형도 마찬가지로 변수에 다시 객체를 선언한다면 에러가 난다. 하지만 초기화된 객체 안의 변수에는 final이 아니므로 수정이 가능하다. 즉 참조 자료형의 변수가 final이라도 그 안에 있는 변수가 final이 아니면 수정할 수 있다.