제가 3회 코딩테스트에 출제한 문제 중에, 가희와 쓰레기 놀이가 있었습니다. 이 문제에 대한 풀이는 다음 편에 상세히 올리도록 하겠습니다. 대신에, 이번에는 어떤 것을 가지고 출제했는지에 대한 썰을 풀어보도록 하겠습니다. 이미, 제 포스팅 스타일을 보신 분들은 눈치 채셨을 지도 모르겠지만. 제 코딩테스트에서 3번 문제는 예외없이 cs가 나오기도 했고요.

 


 일단 자바나 python이나, weak reference 비슷한 게 또 있음을 알 수 있어요. 강한 참조 관계가 아닌 얘들이 있는데요. 자바는 soft, weak, 팬텀이 있긴 한데요. 여기서 다룰 내용은 아닌 듯 합니다. 저는 여기서 의문이 하나 들었습니다. 아니. 굳이 왜? 그냥 객체 a로부터 b에 접근할 수 있다고 치면, 강한 연결 관계로만 대충 이어버리면 되지 왜 이런 것까지 도입해 놓았을까요?

 

 

 일단, 예제 프로그램의 Main 부터 보겠습니다. 다른 건 없고, sampleObj의 weakreference 5001개를 저장할 배열을 하나 선언했습니다. 그리고 5번째 줄의 for loop는 새로 생성된 sampleObj 객체를 약한 참조 관계에 이어버리는 건데요. sampleObj 내부를 보겠습니다.

 

 

 여기 안에는 ArrayList가 하나 있습니다. 여기까지 보고, 참조 관계를 정리해 봅시다.

 

 먼저, o는 weakReference들을 가지고 있는 배열입니다.

 

 

 이 약한 참조 관계들은 sampleObj를 가지고 있게 됩니다.

 

 

 그리고 이 sampleObj는 ArrayList를 가지고 있습니다. 그림을 단순화 해서 그려보면 오래 됩니다.

 

 

 그러면 o 입장에서 주황색으로 칠한 곳으로 접근하기 위해서, 약한 참조 관계를 통하지 않고 가는 방법이 없어요. 제가 출제한 문제에서 상세하게 상황 설명을 해 주고 있는데요. weakly reachable 하다고 합니다.

 


 실제로 weak reference는 gc의 대상이 되는 것을 막아주지 못한다고 되어 있어요. 그렇다는 이야기는 언젠가는 gc의 대상이 될 수도 있다는 이야기입니다.

 

 

 gc가 weakly reachable한 것까지 수거해야 겠다고 판단이 된 경우에 제거가 될 거라고 문서에서도 설명하고 있습니다.

 

 

 finalize는 gc에 의해서 불려지게 되는데요.

 

 gc가 더 이상 object로의 reference가 없다는 것을 판단했을 때, 부릅니다.

 

 

  실제로 프로그램을 돌려보면, finalized가 꽤 많이 찍히는 것을 볼 수 있는데요. 루트로부터 약한 참조 관계로 연결되었음에도 불구하고, gc의 판단 하에 제거가 되었음을 의미합니다. 이제 제가 의문을 가진 질문으로 다시 돌아가 보겠습니다. 그냥, strong reference만 있어도 될 텐데, 왜 굳이 이런 것까지 있을까요?

 


 가끔 우리는 크롬이나 엣지에서 검색 데이터를 지우는 경우가 있어요. 캐시된 이미지 파일이라던지. 이런 것의 특성은 당장은 유용하게 쓰일 수 있지만, 시간이 지나면 필요 없어질 수도 있다는 것입니다. 예를 들자면, 캐시는 어떤가요? 없으면 다시 불러오면 그만입니다. 속도만 느려질 뿐이지. 그래서 저는 아. 저장하면 이득은 있지만, 유지 되도 그만, 안 되도 그만. 없으면 시간 좀 들이면 되는 친구들을 강한 연결관계가 아닌 다른 연결 관계로 연결하겠구나. 라는 결론을 내리게 되었습니다. 그리고 이러한 내용을 바탕으로 문제를 출제하게 되었습니다.

 

 해당 문제에 대한 풀이는 생각보다 긴 편이니 다른 글에 올리도록 하겠습니다.