Java, final 참조
필드, 멤버 변수 등 final 키워드는 변수의 값을 변경하지 못하게 하였다.
그리고 변수의 값은 유형 두 가지가 있었다. 기본형과 참조형
기본형과 참조형
- 기본형 변수: 문자열 "Hello" 또는 숫자 10 와 같은 값을 보관한다.
- 참조형 변수: 이 변수는 객체의 참조값을 보관한다.
final 의 기본형과 참조형의 변경
- 기본형 변수: 문자열 숫자를 할당한 경우 변경할 수 없었다.
- 참조형 변수: 한번 참조한 변수는 다른 참조 값으로 변경할 수 없다.
단, 참조형인 경우 그 참조 대상 내부에 있는 멤버 변수는 변경할 수 있다.
final - 참조형 내부 변수 변경하기
먼저 코드를 작성한다.
Data.java
package finalLocal;
public class Data {
public int value;
}
DataRefMain.java
package finalLocal;
public class DataRefMain {
public static void main(String[] args) {
final Data data = new Data();
// data = new Data(); // data 는 이미 참조되어 있으므로 덮어씌우거나 변경할 수 없다.
data.value = 10;
System.out.println(data.value);
data.value = 365;
System.out.println(data.value);
}
}
출력 결과
10
365
- final 로 선언한 data 변수 자체는 덮어 씌우거나 변경할 수 없었다.
final Data data = new Data();
// data = new Data(); // data 는 이미 참조되어 있으므로 덮어씌우거나 변경할 수 없다.
- data 의 인스턴스 Dot(.) 접근하여 value 의 값을 변경하면서 값을 출력하는 것을 볼 수 있었다.
- value 변경할 수 있었던 이유는 Data 클래스 value 필드가 final 키워드를 사용하지 않았으므로 값을 변경할 수 있었다.
data.value = 10;
System.out.println(data.value);
data.value = 365;
System.out.println(data.value);
요약
- final 키워드를 선언한 참조는 다른 참조로 변경 불가
- 인스턴스 속성까지 final 속성이 아님. 따라서 데이터 변경 가능.