본문 바로가기
Java

자바 객체 타입 변수에 final의 이해

by latissimus 2022. 7. 2.

원시타입에 final을 붙여서 초기화하면 값을 변경할 수 없다. 다음과 같이 오류가 뜨는 것을 확인할 수 있다.

 

이런 사례가 눈에 익어서 그런지, 이전부터 보통 자바에서 변수에 final을 붙이면 변경불가로 알고 있었다. 그런데 일급컬렉션을 공부하면서 안정성을 위해 객체에 final로 지정해주는 경우를 보았고, 객체의 내부는 계속 변경되었다. 변경 불가인데 왜 변경이 되는지 의문이 들었다.

 

알고보니 원시타입과 객체에 final이 붙었을 경우는 다르게 생각해야 했다. final을 객체타입에 붙였을 경우, 객체 자체가 변경 불가능한 것은 아니다.

 

 

위키피디아 final(Java) https://en.wikipedia.org/wiki/Final_(Java)#cite_note-1

 

 

밑줄친 부분을 보면, "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 

 

자바에서 final에 대한 이해

Gatsby로 블로그 마이그레이션을 하여 이 링크를 클릭하면 해당 포스팅으로 갑니다. 감사합니다. http://blog.advenoh.pe.kr 1. 개요 final 키워드를 떠올릴 때면 그냥 상수로만 생각할 때가 종종 있습니다

advenoh.tistory.com

advenoh님 블로그에 정리가 잘 되어있다. final을 변수, 메서드, 클래스에 붙였을때 차이와 멤버변수의 초기화 시점도 자세히 써져 있어서 참고했다.

댓글