Post

Java의 final keyword가 객체(object)의 불변성(immutability)을 보장하지 않는 다는 것의 의미

요약

Java의 final keyword가 객체의 불변성을 보장하지 않는다는 것은 객체의 내부 상태는 변경될 수 있음을 의미합니다.

Intro

Java 기본서를 보다보면, final keyword는 초보자에게는 설명하기 힘든지 갑자기 어영부영 넘어갑니다. 그래서 저도 제대로 이해 못하고 어영부영 넘어갔던 것 같습니다. 그런데 오늘 ‘final keyword가 객체의 불변성을 보장하지 않는다’고 있어보이는 용어로 적어놓은 것을 보니 이해가 안됐었는데, C언어 포인터가 생각이나서 이해가 됐습니다.

C언어 포인터를 통한 이해

Java의 final keyword와 유사한 역할을 하는게 C에서는 const keyword 입니다.

포인터를 자세히 이해할 필요는 없으므로 간단히 설명하자면, 메모리 주소를 저장하는 변수입니다. 그리고 아래 & 연산자는 변수의 메모리 주소를 반환합니다.

첫 번째 예제는 value를 변경할 수는 없지만, pvalue는 변경할 수 있습니다.

1
2
const int value = 20;  
const int* pvalue = &value;

두 번째 예제는 value는 변경할 수 있지만, pvalue는 변경할 수 없습니다.

1
2
int value = 20;  
int* const pvalue = &value;

마지막 예제는 value와 pvalue 모두 변경할 수 없습니다.

1
2
const int value = 20;  
const int* const pvalue = &value;

final keyword가 객체의 불변성을 보장하지 않는다는 것은 위의 두 번째 예제와 같은 상황이 됩니다. 참조 변수가 가리키는 객체를 변경하려고 하면, IDE에서 아래와 같은 오류 메시지를 볼 수 있습니다.

final keyword를 사용한 참조 변수

chatGPT 설명

C/C++ 을 잘 모르시면 그냥 보기 싫으실 수도 있으니 chatGPT의 설명을 추가로 첨부합니다. 오류는 없어서 그대로 붙여넣었습니다.

java의 final keyword는 불변성을 보장하나요?

Java의 final 키워드는 불변성을 부분적으로 보장할 수 있습니다. final 키워드는 다양한 상황에서 사용될 수 있는데, 변수, 메소드, 클래스에 적용할 수 있습니다.

  1. 변수에 final 키워드를 사용하면, 변수의 값을 변경할 수 없게 됩니다. 이 경우, 변수는 상수로 취급됩니다. 기본 타입의 변수에 final 키워드를 사용하면, 그 값은 변경되지 않습니다.

예를 들어, 다음과 같은 코드를 생각해보세요:

1
final int x = 10;

여기서 x는 상수로 취급되며, 다른 값으로 변경할 수 없습니다.

  1. 객체 참조 변수에 final 키워드를 사용할 경우, 참조 변수가 가리키는 객체를 변경할 수 없습니다. 하지만 객체 내부의 상태는 변경할 수 있습니다.

예를 들어, 다음과 같은 코드를 생각해보세요:

1
final List<String> myList = new ArrayList<String>();

여기서 myList 참조 변수는 다른 객체를 가리키도록 변경할 수 없지만, myList의 요소를 추가하거나 삭제할 수 있습니다.

  1. 메소드에 final 키워드를 사용하면, 해당 메소드는 오버라이딩(overriding)되지 않습니다. 이를 통해 메소드의 동작이 변경되지 않도록 보장할 수 있습니다.

  2. 클래스에 final 키워드를 사용하면, 해당 클래스는 상속될 수 없습니다. 이를 통해 클래스의 동작이 변경되지 않도록 보장할 수 있습니다.

그러므로, final 키워드를 사용하면 불변성을 부분적으로 보장할 수 있지만, 객체의 내부 상태를 완전히 보호할 수 없습니다. 객체의 불변성을 보장하려면, 클래스를 설계할 때 모든 필드를 private으로 설정하고, 모든 멤버 변수를 final로 선언하며, 내부 상태를 변경하는 메소드를 제공하지 않는 것이 좋습니다.

This post is licensed under CC BY 4.0 by the author.