Study/JAVA

java의 final 키워드 :: 참조 변수 & 변수

YGwan 2023. 4. 21. 17:13

 

 

java의 final 키워드는 값을 변하지 않게 하기 위해서 사용합니다. 즉, 값의 불변성을 확보할 수 있도록 합니다. 해당 키워드는 변수, 메서드, 클래스에서 주로 사용할 수 있습니다. 물론 각각의 상황에 맞게 의미가 조금씩 바뀌긴 하지만, 기본적으로 "무엇가를 제한한다" 라는 의미는 동일합니다.

 해당 키워드는 개인적인 작업보다 팀 단위의 작업에서 더 중요하게 사용됩니다. 만약 내가 어떤 변수를 사용했고 이 변수가 변하지 않아야 한다고 가정했을때, 내가 혼자 작업했을때는 바로 알 수 있습니다. 하지만 팀 단위의 작업에서는 이 변수가 고정되야되는지 상대방이 모를 수 도 있습니다. 혹은, 코드가 복잡해지면 실수로 해당 변수를 건드릴 수도 있습니다. 이러한 문제를 사전에 방지하기 위해 자바에서 제공하는 키워드가 final 입니다.

 

클래스(clas) 변경 될 수 없는 클래스

다른 클래스의 조상이 될 수 X
메서드(method) 변경될 수 없는 메서드

오버라이딩을 통해 재정의 될 수 X
변수 변경할 수 없는 변수

값을 변경할 수 X

 

 

간단하게 이렇게 설명할 수 있습니다. 저는 여기서 변수를 좀 더 자세히 설명하도록 하겠습니다. 변수는 크게 기본형(Primitive) 변수와 참조형 변수(Reference) 변수로 나뉩니다.

 

1. 기본형 변수

 

기본형 변수는 선언한 변수에 실제 값이 담기는 변수를 의미합니다. 기본형 변수의 종류는

  • byte
  • short
  • int
  • long
  • float
  • double
  • boolean
  • char

이렇게 총 9가지의 종류가 존재합니다. 기본형 변수에 final을 사용하면 우리가 아는 일반적인 상수가 됩니다. 즉, 해당 변수는 이제 더이상 바뀔 수 없는 변수가 된다는 뜻입니다. 하지만 참조형 변수는 살짝 느낌이 비슷하면서 다릅니다.

 

 

2. 참조형 변수

 

참조형 변수는 변수에 해당 값에 접근하기 위한 주소가 담기는 변수를 의미합니다. 참조형 변수의 종류는 기본적으로 기본형 변수를 제외한 나머지 종류의 변수를 의미합니다. 예를 들어, 배열, 열거형, 클래스 등이 있습니다.

참조형 변수에 final을 사용하면 해당 변수가 가리키는 객체를 변경하지 못한다는 의미입니다. 예를 들어,

 

public class Main() {

	public static void main(String[] args) {
		final List<String> list = new ArrayList();
    }
}

 

이러한 코드가 잇다고 가정했을때 해당 변수의 메모리 구조는

이런식으로 구현됩니다. 간단히 설명하자면 list의 참조형 변수는 stack에 저장되고 해당 스텍에서 heap의 특정영역을 가리키는 형태로 구현됩니다. 만약 해당 변수를 final로 설정했다면 보이는 화살표는 바뀔 수 없습니다. 하지만 heap내의 내용물은 추가 및 삭제가 가능합니다.

 정리하자면, 참조형 변수는 객체 내부의 값은 변경할 수 있지만 가리키는 객체는 변경할 수 없습니다.