원시타입에 final을 붙여서 초기화하면 값을 변경할 수 없다. 다음과 같이 오류가 뜨는 것을 확인할 수 있다.
이런 사례가 눈에 익어서 그런지, 이전부터 보통 자바에서 변수에 final을 붙이면 변경불가로 알고 있었다. 그런데 일급컬렉션을 공부하면서 안정성을 위해 객체에 final로 지정해주는 경우를 보았고, 객체의 내부는 계속 변경되었다. 변경 불가인데 왜 변경이 되는지 의문이 들었다.
알고보니 원시타입과 객체에 final이 붙었을 경우는 다르게 생각해야 했다. final을 객체타입에 붙였을 경우, 객체 자체가 변경 불가능한 것은 아니다.
밑줄친 부분을 보면, "final 변수가 객체를 참조하는 경우, 객체의 상태는 변경될 수 있지만, 변수는 같은 객체를 참조한다." 라고 말하면서 배열에도 동일하게 적용됨을 이야기 하고 있다.
다시말해서, 다음과 같이 객체의 상태는 변경 가능하지만, 객체를 새로 생성하면 오류가 발생한다. List로 간단히 실험을 해봤다.
public class Test {
static final List<String> list = new ArrayList<>();
static final int num = 3;
public static void main(String[] args) {
// num = 1; -> 오류 발생
// list = new ArrayList<>(); -> 오류 발생
// final객체인 list의 상태 변경
list.add("나는 ");
list.add("final ");
list.add("list다.");
for (String string : list) {
System.out.print(string);
}
}
}
출력 : 나는 final list다.
https://advenoh.tistory.com/13
advenoh님 블로그에 정리가 잘 되어있다. final을 변수, 메서드, 클래스에 붙였을때 차이와 멤버변수의 초기화 시점도 자세히 써져 있어서 참고했다.
'Java' 카테고리의 다른 글
Pattern, Matcher를 matches()를 이용한 간단한 정규표현식 대조 (Java 11) (0) | 2022.03.27 |
---|---|
메서드 오버라이딩 리턴 타입이 다른 경우 (Java) (0) | 2021.10.04 |
댓글