본문 바로가기
엑셈 기업문화/엑셈 사람들

[신형규]달면 삼키고 쓰면 뱉는다.

by EXEM 2009. 1. 9.


개발팀에 입사하고 이것저것 새로운 지식들을 탐구하고 습득하게 되면서 나의 부족함에 대해 매번 느끼게 된다. 그런데 이런 부족함 속에서도 안 좋은 습관이 있었으니 그것을 한 마디로 표현 하자면 감탄고토(甘呑苦吐). 즉, 달면 삼키고 쓰면 뱉게 된다는 식의 습관이었다.

신입이기에 아직 부족한 경험과 지식들로 중무장한 머리에서는 상황에 적절한 것들을 사용할 수 있는 개념들이 있음에도 불구하고 일단 쉽고 나한테 편리한 것들을 가져다가 사용하는, 좋지 못한 습관을 가지게 되었다.
최근에 이러한 습관으로 지내오다 뜻밖의 수확을 얻은 것이 있었으니, 바로 TObjectList였다. 

우리 제품뿐만이 아니라 어느 델파이 프로그램이건 간에 가장 많이 등장하는 자료구조 중 하나는 List일 것이다.
보통 class Object를 관리하려면 TList나 TStringList를 종종 쓰곤 하는데 TObjectList를 사용함으로써 Object를 보다 더 쉽게 관리할 수가 있게 되었다.
TList를 사용을 하고 해제 시에는 여느 객체들과 같이 항상 해제하는 코드를 작성해야 한다.
이러한 메모리에 대한 해제는 보통 다음과 같을 때에 일어난다.

- Delete, Remove, Clear 메소드를 호출할 때
- TObjectList 자체가 소멸될 때(TObjectList의 소멸자가 호출될 때)
- Item에 새로운 Item이 할당(Assign)될 때 (그 Item에 이전에 있던 객체를 Free해 준다)

하지만 이런 해제작업은 가끔 실수로 인한 메모리 릭 현상이 발생활 확률이 있다. 또한 TList 같은 경우는 Add된 item이 존재하면 하나하나 꺼내서 delete 시켜줘야 하는 다소 불편한 점도 없지 않아 있다.
하지만 이 TObjectList는 생성만 하면 단지 리스트의 삭제만으로 메모리 해제까지 해주는 편리함을 제공해 준다.

이런 TObjectList를 지금부터 살펴보도록 하자.
TObjectList는 Contnrs 유닛에 정의되어 있으며, TList를 상속받은 클래스이다.

TObjectList = class(TList)      <Contnrs.pas>

TObjectList 클래스에는 OwnsObjects 라는 Boolean형 프로퍼티가 있다.
이 값이 True값이면 객체가 자동으로 소멸이 되며 False이면 자동으로 소멸이 되지 않는다.
그러므로 값을 False로 놓는다면 TList와 동일하게 사용할 수 있다.

TestList := TObjectList.Create(True); //OwnsObjects is True
혹은
TestList := TObjectList.Create;
TestList.OwnsObjects := True;     //Default 값은 True이다.

다음은 간단하게 TObjectList를 활용한 예이다.

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FList := TObjectList.Create(True); // OwnsObjects is True.
end;

procedure TMainForm.AddString;
var
  MyStringList1: TStringList;
MyStringList2: TStringList;
begin
  MyStringList1 := TStringList.Create;
  MyStringList2 := TStringList.Create;
  try
    MyStringList1.Add('haha');
    MyStringList1.Add('hoho');
    FList.Add(MyStringList1);

  MyStringList2.Add('hehe');
    MyStringList2.Add('hihi');
    FList.Add(MyStringList2);

  except
    FreeAndNil(MyStringList1);
    FreeAndNil(MyStringList2);
  end;
end;

 

prcedure TMainForm.FormDestroy(Sender: TObject);
begin
  FList.Free;
end;
//단지 TObjectList를 Free 시켜줌으로써 저장된 Object들의 메모리 해제는 신경쓰지 않아도 된다!!

아직 많은 경험을 한 건 아니지만 위의 간단한 예처럼, 델파이에서는 개발자로 하여금 좀더 유연한 코드작성이 가능하도록 제공하는 프로시져나 클래스 라이브러리들이 많이 있는 것 같다. 이러한 클래스 라이브러리가 당장 나에게는 피와 살이 되겠지만 좀 더 깊고 다양한 경우를 파고 들다 보면 독이 될 수도 있음을 깨달을 수 있을 때, 즉 배움의 시작에서 맛보는 단맛도 잘 받아들여야겠지만 쓴맛 또한 달게 만들 수 있는 능력을 키울 수 있도록 앞으로도 학습을 꾸준히 해야겠다.  

댓글