static과 final

유수민·2022년 11월 21일
0

대화안의 지식

목록 보기
1/9
post-thumbnail

공부를 하다 스몰토크에서 final와 GC이야기가 나왔다. final로 선언을 하면 GC가 life cycle을 따로 관리하지 않는다는 이야기에 단순히 final이 변수 수정을 하지 않도록 막기 위해 쓰는 것이라고 알뿐 메모리적인 면에서는 고려하지 않았다는 생각이 들었다. final과 더불어 static도 메모리 관점에서 어떤 이점이 있길래 선언하는지 짧게 정리하려고 한다.

📌static

1) GC는 힙 메모리에서 관리하는데 static은 메서드영역(Method Area)에 있기 때문에 메모리 영역이 다르다. 이말은 즉, GC가 static로 선언되었을 경우, 관리를 하지 않는다는 의미이고 메모리에 계속 남아있다는 말과 통한다.
-> 무분별하게 사용하면 메모리부족현상이 발생한다.

참조) https://mangkyu.tistory.com/47

2) static으로 선언한 변수는 같은 메모리를 공유한다. 따라서 동일한 타입의 객체들이 서로 자원을 공유할 경우에 많이 사용된다.모든 객체가 공유하고 하나의 멤버를 어디서든지 참조할 수 있다

3) 새로운 메모리를 할당하지 않고 공유한다는 의미로 사용된다.

📌final

1) 불변하도록 만드는 것이 아니라 재할당할 수 없도록 만드는 것이다.
-> final로 선언시 대게 Collections타입(Map,List,Set)에 재할당은 안되지만 값은 변할 수 있고, 기본 데이터 타입인 int, boolean, char 등등에서는 재할당이 안되니 값을 변경할 수 있는 방법이 없다.
-> 기본형 변수라면 값을 변경하지 못하고 참조형 변수라면 가리키는 객체를 변경하지 못한다. (https://sabarada.tistory.com/148)

2) final은 불변객체를 만들기 위한 방법 중 하나이다.
-- 값이 변하지 않기 때문에 더이상 동기화를 고려하지 않아도 된다.

3) 가비지 컬렉터가 스캔해야 되는 객체의 수를 줄여서 스캔해야하는 메모리 영역과 빈도수, GC가 수행되어되 발생하는 지연 시간을 줄일 수 있다. (GC 성능 향상)
-- 불변 객체를 가지는 컨테이너 객체를 참조하는 하위의 불변 객체들은 GC가 skip할 수 있도록 도와준다. 해당 컨테이너 객체가 살아 있다는 것은 하위의 불변 객체들 역시 처음에 할당된 상태로 참조되고 있음을 의미하기 때문이다.
참조) https://mangkyu.tistory.com/131

profile
배우는 것이 즐겁다!

0개의 댓글