기본이되는 내용이지만 짚고 가야할 내용이라 정리해두었다.
일반적으로 Primitive Type 에 대해서 final 로 선언되면 해당 객체를 바꿀 수 없지만, Object 의 경우 final 로 선언되면 해당 객체 혹은 해당 객체 멤버의 내용은 바꿀 수 있다.
Object 앞에 선언되는 final의 의미는 해당 객체를 가리키는 포인터를 바꿀 수 없게 하는 의미로, 해당 이름으로 새 객체의 선언 / 재할당을 막는 다는 의미가 된다.
(ex)
Public foo(Obj_1 Obj1, final Obj_2 obj2){
Obj1 = new Obj_1(); //가능
Obj2 = new Obj_2(); //불가능
Obj1.setId(12345); //가능
Obj2.setId(12345); //가능
}
시스템이 굉장히 복잡하다고 가정했을 때, 특히 멀티 쓰레드 환경에서 Thread Safe 하지 않은 객체에 대해 자바 가상 머신의 예기치 못한 동작으로 특정 메모리 영역의 객체는 얼마든지 다른 객체로 변할 여지가 있다.
이는 개발자 입장에서는 버그이지만 JVM입장에서는 버그가 아닌 동작일 수 있다. 그런 경우를 방지하기 위해 메모리를 참조하는 주소를 final 키워드를 이용해서 고정시켜놓으면 그러한 불상사를 예방할 수 있다.
'Programming Language > Java' 카테고리의 다른 글
Java8 의 Stream API 에 대하여 (0) | 2018.08.28 |
---|---|
가비지 컬렉터(Garbage Collector) 의 개념과 동작 원리 (0) | 2018.08.15 |
Java8 에서 새로 생겨난 API 들 (0) | 2018.08.09 |
Java 의 Static Initialize 를 이용한 Static 변수의 늦은 초기화 (0) | 2018.08.08 |
Java를 이용한 Daemon Process 와 Background Process 만들기 (0) | 2018.08.08 |