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 속성이 아님. 따라서 데이터 변경 가능.