왜 그런 약속을 했는지 모르겠다. 처음에는 별 것 아니라고 생각했다. 이제 와서 생각해보면 터무니 없이 안일한 태도였다. 마소 6월호 원고 마감일을 하루 앞두고 수정 건도 있는데 왜 수락했을까?
이틀째 집에 오자마자 Netbeans를 켠다. 유사한 점이 많다고는 해도 GUI 프로그래밍을 하려니, C#을 주로 다루는 나에겐 벅찬 듯 하다. 정말 간단한 데이터 구조 숙제인 줄 알았다. 그러나 데이터 구조를 화면에 보여줘야 하다니 보통 일이 아니었다.
결국 요구사항 중 일부를 구현 못하고 작업이 끝났다. 그 정도로 만족한다니 다행이지만, 더 잘해 주지 못해서 미안했다.
아차, 방심하는 사이에 이야기가 샜다. 이 과제는 나름대로 재밌었다. 완전히 새로 짜는 것이 아니라, 어느 정도 구축된 인터페이스와 데이터 구조 위에 새로운 기능을 추가하는 것이었다. 어제는 기존 소스 코드를 수정하면서 재밌는 소재를 찾았다. 여기서는 C#으로 예제 코드를 만들었다.
private List<int> list = null; private void ButtonClicked() { if (list == null) { list = new List<int>(); } else { list.Clear(); } // some List operations }
사용자가 버튼을 누르면 List
에 새로운 값을 입력하고, 트리 구조 등을 만든다. 여기서 문제는 굳이 null 체크를 위해 분기해야만 하냐는 점이다. if/else 부분을 단순하게 list = new List<int>();
로 바꾸면 안 될까? GC가 알아서 참조를 잃어버린 List
인스턴스를 제거해 줄 것이다.
물론 ButtonClicked()
메써드가 자주 호출된다면 List
인스턴스 생성에 필요한 자그마한 오버헤드도 매우 큰 효과를 불러일으킬 수 있다. 하지만 UI를 통해 입력이 들어왔을 때만 실행되는 메써드라면 매번 새로운 객체를 생성해도 무방하다.