final 변수와 참조.
final
은 변수의 값을 변경하지 못하게 막습니다. 그런데 여기서 변수의 값이라는 것은 무엇일까요?
- 변수는 크게 기본형 변수와 참조형 변수가 있습니다.
- 기본형 변수는
10
,20
같은 값을 보관하고, 참조형 변수는 객체의 참조값을 보관합니다.-
final
을 기본형 변수에 사용하면 값을 변경할 수 없습니다. -
final
을 참조형 변수에 사용하면 참조값을 변경할 수 없습니다.
-
여기까지는 이해하는데 어려움이 없을 것입니다.
이번에는 약간 복잡한 예제를 만들어 봅시다.
package final1;
public class Data {
public int value;
}
package final1;
public class FinalRefMain {
public static void main(String[] args) {
final Data data = new Data();
//data = new Data(); // final 변경 불가 컴파일 오류
// 참조 대상의 값은 변경 가능
data.value = 10;
System.out.println(data.value);
data.value = 20;
System.out.println(data.value);
}
}
final Data data = new Data();
// data = new Data(); // final 변경 불가 컴파일 오류
- 참조형 변수
data
에final
이 붙었습니다.- 변수 선언 시점에 참조값을 할당했으므로 더는 참조값을 변경할 수 없습니다.
data.value = 10;
data.value = 20;
- 그러나 참조 대상의 객체 값은 변경할 수 있습니다.
- 참조형 변수
data
에final
이 붙었습니다.- 이 경우 참조형 변수에 들어있는 참조값을 다른 값으로 변경하지 못합니다.
- 쉽게 이야기해서 이제 다른 객체를 참조할 수 없습니다.
- 그런데 이것의 정확한 뜻을 잘 이해해야 합니다.
- 참조값만 변경하지 못한다는 뜻입니다.
- 이 변수 이외에 다른 곳에 영향을 주는 것이 아닙니다.
- 참조값만 변경하지 못한다는 뜻입니다.
- 이 경우 참조형 변수에 들어있는 참조값을 다른 값으로 변경하지 못합니다.
- 참조형 변수
-
Data.value
는final
이 아닙니다.- 따라서 값을 변경할 수 있습니다.
- 정리하면 참조형 변수에
final
이 붙으면 참조 대상 자체를 다른 대상으로 변경하지 못하는 것이지, 참조하는 대상의 값은 변경할 수 있습니다.