Q&A

  • 죄송합니다 이렇게 초보적인 질문을 드려서.. 객체에 관해서입니다.
델파이를 공부하면서 딱히 괜찮은 책을 못골라 이런저런 책 둘러보고 있습니다.
헌데.. 객체를 배우는 부분에서 궁금한게 있습니다.
제가 이해한 바로는.. 델파이에서는 객체를 쓸때 반드시 생성자와 소멸자를 사용해야 한다고
들었습니다.
그래서 아래와 같은 경우는 이해가 됩니다. 폼이 두가지(Form1, Form2) 일때
From1 에서 Form2 를 모달폼으로 띄우는 경우..

1.  Form2 := TForm2.Create( sellf );
2.  Form2.ShowModal;
3.  Form2.Free;

제가 이해한 바라면 1번은 Form2 라는 객체를 메모리에 올리는 작업, 즉 생성자..
2번은 화면에 띄우는 메쏘드... 그리고 3번은 Form2 가 종료될때 메모리에서 해제시키는 메쏘드..
다시 말하면 소멸자 정도..

저는 이렇게 이해를 했는데요.. 맞는지 모르겠네요.. 틀리다면 갈차주시기 바라구요..

정말로 궁금한건 사실 위에께 아닙니다.
제가 프로그래밍을 하다가.. TestMyClass 라는 유닛화일로 클래스를 만들어 봤는데요..
대충 이렇습니다.

Type
  TMyClass = Class
          Private
          Public
              Constructor Create;
              Destructor Destroy;
             Procedure ShowMsg( Msg: String );
  end;
var
  MyClass: TMyClass
Procedure TMyClass.ShowMsg( Msg: String );
begin
  ShowMessage( MsG );
end;

단순히 받은 메세지를 화면에 띄우는 메소드를 가진 클래스입니다.
그런데 프로그래밍을 하다가 이 객체를 이용하려면..
1. uses 절에 이 유닛의 파일명을 첨부시킨다.
2. MyClass.ShowMsg( '아무거나' ); 와 같이 메소드를 사용한다.
맞나요?
맞다면 질문이 있습니다. 그냥 uses 절에 유닛파일명을 첨부만 시킨건데..
어떻게 MyClass 라는 객체를 사용하는게 가능한지요. 제 생각엔 생성자도 호출시키고
사용한 뒤엔 소멸자도 호출시켜야 하는거 같은데..
위처럼 사용하는게 틀리다면.. 어떻게 객체를 사용하는지 가르쳐주십시오.
다시한번 이렇게 초보적인 질문 드려서 죄송합니다. 검색을 아무리 해도..
꾸벅..
1  COMMENTS
  • Profile
    하얀까마귀 2003.02.03 20:53
    안녕하세요 하얀까마귀 입니다.

    당연히 생성자와 소멸자를 불러줘야 합니다.
    말씀하신 ShowMsg 라는 메소드를 부르기전에 반드시 생성자를
    불러주셔야만 합니다..

    폼의 생성처럼 저렇게 반드시 생성자와 showmodal은 폼이 띄워져 있는동안에는 다음스템으로 넘어가지 않으므로 close 된다음에는 free를 시켜주야 하죠

    하지만.. 컴파일러에서는 생성되엇는지에 대해서는 첵크하지 않습니다.
    실행되고 있을때의 문제죠..

    아마도 님께서 질문하신 이유가 작성하신 코드는 생성자를 부르지 않아도
    실행되기 때문일꺼라 생각합니다.

    실행되는건 아무것도 없기때문입니다.

    생성자 자체가 필요없는 클래스이기 때문이죠..

    생성자라는건 해당 클래스에 필요한 메모리를 잡아주는 부분입니다.

    님께서 작성하신 코드는 클래스가 아니라 단지 메소드만 작성하셔도 돌아가는
    소스죠..

    Procedure ShowMsg( Msg: String );


    Procedure TMyClass.ShowMsg( Msg: String );
    begin
      ShowMessage( MsG );
    end;

    다빼버리고 위의 것만 남겨둔다 하더라도 잘돌아갈수 잇는겁니다.

    해서 단지 매소드만 존재한느것이기에 가능한겁니다.

    보통의 경우는 클래스에 각종 변수및 그와 연관된 프로퍼티들 그리고 함수들이

    존재합니다. 그리고 그러한 동작을 위해서 메모리를 잡아주어야 겠죠..

    이러한 선행작업을 create에서 해주셔야만 합니다.

    간단하게 고치면..



    Type
      TMyClass = Class
              Private
                 aaa : Integer
              Public
                  Constructor Create;
                  Destructor Destroy;
                 Procedure ShowMsg( Msg: String );
      end;
    var
      MyClass: TMyClass

    constructor TMyClass.Create;
    begin
      aaa := 0;
    end;

    destructor TMyClass.Destroy;
    begin
      //
    end;

    // 고친부분...
    Procedure TMyClass.ShowMsg( Msg: String );
    begin
      inc(aaa);
      ShowMessage(inttostr(aaa) +': ' +  MsG );
    end;

    이것처럼 고치게 되면.. 생성자를 불러주지 않으면 에러가 날껍니다.
    aaa 라는 변수가 메모리에 할당되지 않았기 때문이죠..

    이해하기 쉽게 이야기한다고 했는데 더 복잡하게 이야기한거 아닌가 싶네요.^^

    그럼.. 즐거운시간 되세요.