[Java] final 변수와 참조

코드 속의 "진돌"·2024년 3월 5일
0
post-thumbnail

✅ final 변수와 참조


final은 변수의 값을 변경하지 못하게 막는다. 그런데 여기서 변수의 값이라는 것이 무엇일까?

  • 변수는 크게 기본형 변수와 참조형 변수가 있다.
  • 기본형 변수는 10, 20 같은 값을 보관하고, 참조형 변수는 객체의 참조값을 보관한다.
    • final을 기본형 변수에 사용하면 값을 변경할 수 없다.
    • final을 참조형 변수에 사용하면 참조값을 변경할 수 없다.



✏️ Data

package final1;

public class Data {

  public int value;
}
  • int value : final이 아니다. 변경할 수 있는 변수다.



✏️ FinalRefMain

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 변경 불가 컴파일 에러

참조형 변수 datafinal이 붙었다. 변수 선언 시점에 참조값을 할당했으므로 더는 참조값을 변경할 수 없다.


data.value = 10;
data.value = 20;

그런데 참조 대상의 객체 값은 변경할 수 있다.

  • 참조형 변수 datafinal이 붙었다. 이 경우 참조형 변수에 들어있는 참조값을 다른 값으로 변경하지 못한다. 쉽게 이야기해서 이제 다른 객체를 참조할 수 없다.
    그런데 이것의 정확한 뜻을 잘 이해해야 한다. 참조형 변수에 들어있는 참조값만 변경하지 못한다는 뜻이다. 이 변수 이외에 다른 곳에 영향을 주는 것이 아니다.
  • Data.valuefinal이 아니다. 따라서 값을 변경할 수 있다.

참조형 변수에 final이 붙으면 참조 대상 자체를 다른 대상으로 변경하지 못하는 것이지, 참조하는 대상의 값은 변경할 수 있다.

profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글