Q&A

  • Create(Self)에 대한 마지막 궁금증 해결을 위한 질문.
안녕하세요. 기지훈입니다. 'Self'에 대해서 Help도 읽어보았고 여기 한델 글도 읽어보고 많은 도움 얻었습니다.

'Self'에 관한 마지막 궁금증을 해결하기 위해서 글 올립니다. 꼭 좀 부탁드려요! :)



단순히 Unit1에 Form1(메인폼)을 만들고 Form1에 있는 Button1을 클릭시 Form2를 생성하게 하려고 합니다.

'Self'에 대한 다음과 같은 설명을 보았습니다.
(http://delphi.about.com/library/weekly/aa031301a.htm에서 발췌)

When we use the keyword <Self> as the parameter for the Create method - the object we are creating is <owned by the 'class' that the 'method' is contained in.>

위 문장에서 'class'와 'method'는 각각 무엇을 지칭하는지요?

<질문1>
아래 코드를 예로 들면 'method'는..
1. Create메소드를 뜻하나요?
2. TForm1.Button1Click을 뜻하나요?


<질문2>
'method'를 담고있는 'class'란..
1. create가 속한 Form2가 되나요?
2. create가 작성된 Form1(메인폼)을 뜻하나요?
3. Button1Click가 속한 Form1이 되나요?


<질문3>
위의 영문에선 'class'라고 했지만 help파일을 보면 'Self references the object in which the method is called.'라고 나옵니다. 엄밀히 말했을 때
class가 맞나요? 아님 object가 맞나요?


답변 주시면 정말 감사하겠습니다. 꼭 부탁드려요!!


==============================
unit Unit1;


type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  ....(생략)...
end;
end.
6  COMMENTS
  • Profile
    최용일 2003.09.05 01:35
    안녕하세요. 최용일입니다.

    class는 객체, method는 객체의 함수를 말하네요...

    OOP마다 각기 용어가 틀리는데... 델파이에서 class는 객체를 말합니다. 즉 변수 형이죠. object는 객체의 인스턴스(reference), 즉 실제 변수를 가리킵니다.

    객체(Class)들은 각각안에 Method, Field, Property으로 구성되어 있습니다.

    Method는 객체에 종속되어진 함수입니다. Field는 객체 내부변수이고, Property는 외부적으로 표현되어진 변수로 델파이 속성창에 보이는 것들 입니다.

    예제 코드에 아래와 같은 부분이 있는데... 이런 함수들이 메소드입니다.


    Create도 객체 생성에 관한 일을 하는 특별한 메소드입니다.
    델파이 소스를 보시면 아래와 같이 선언되어 있구요...
        constructor Create(AOwner: TComponent); override;

    그러니까 Class는 객체를 말하고, Method는 객체의 함수를 말합니다.

    질문1은 위에서 설명드린것처럼 Create, TForm1.Button1Click둘 다 메소드입니다.

    질문2는 예제에서 TForm1을 말하는 거구요...

    질문3은 영문을 읽어보시면 둘 다 상황에 맞게 object와 class를 제대로 사용한 거 같은데요...

    흠... 쉽게 얘기하면 class를 생성해서 요넘이 메모리상에 존재하게 되면 object가 되는거죠...

    Self는 객체(Class)를 구현할 때 실제로 메모리상에 존재하는 자기 자신의 인스턴스(즉 Object가 되겠죠)를 참조할 필요가 있을 때 사용하는 겁니다.

    ^^ 항상 즐코하세요...

  • Profile
    박상기 2003.09.05 01:33

    * 수정 했습니다.착오없으시길....죄송합니다.



    먼저 3번 질문부터 답을 해드리면

    Self는 그 메소드를 부른 객체 자신을 가리킵니다.
    형태는 다음과 같이 되어 있습니다.

    var Self : Class Type;

    여기서 보시다시피 클래스 타입이죠

    질문 2번에 대하여 토를 달자면
    아래에서
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2 := TForm2.Create(Self);
      ....(생략)...
    end;
    end.

    여기서 Self는 TForm1를 가리킵니다.
    그러므로 메소드를 담고 있는 클래스는 TForm1이 됩니다.
    의미는 TFrom1이 TFrom2의 소유자가 된다는 뜻입니다.

    질문 1은 당연히 Create가 됩니다.

    더 자세한걸 알고 싶으시면 언제든지 질문환영합니다.
  • Profile
    기지훈 2003.09.05 03:57
    두분 모두 답변 감사합니다.

    추가 질문이 있는데요.

    제가 적은 예제처럼 Form1에서 버튼클릭이벤트로 Form2를 생성했을 경우... Form1이 Form2의 owner가 되나요?


    또 다음과 같은 경우는 create가 인수를 갖지 않습니다. 제가 본 글에 적었던 예제에서는 인수를 없애보니까 에러가나던데요... 여기선 왜 에러없이 실행되는 거죠?

    오히려 Create(Self)라고 쓰면 에러가 납니다.
    [Error] classtest.pas(55): Too many actual parameters

    ============
    unit classtest;
      ...

    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

    type
      TMyClass = Class
        Var1 : Integer;
        Procedure Test ; Virtual;
      end;

    procedure TMyClass.Test;
    begin
      ShowMessage('TMyClass');
    end;

    type
      TTestClass = Class(TMyClass)
        Var2 : Integer;
        Procedure Test ; Override;
      end;

    procedure TTestClass.Test;
    begin
      ShowMessage('TTestClass');
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyClass : TMyClass;
    begin

      MyClass := TTestClass.Create;      // <--- 바로 이부분!!

      MyClass.Test;
      MyClass.Free;
    end;

    end.
    ================

  • Profile
    몽상 2003.09.05 12:03
    생성자 선언이 없으므로
    디폴트 생성자 호출
    또 한가지 더 생성자 호출에 있어서 소유권을 가지는 것은 TComponent클래스의 OWner프로퍼티를 선언해야 한다는 겁니다.

    MyClass := TTestClass.Create; 이것 대신에
    MyClass := TTestClass.Create();이렇게 하셔도 됩니다.

    허접한 설명이라 이해가 될련지..

  • Profile
    열심히 2003.09.05 04:33
    Owner라는건 있을수도 있고 없을수도 있는겁니다..

    TStringList를 동적으로 생성할때는 Owner가 없습니다.

    TQuery같은경우엔 있죠..

    그리고 Create가 몇개 오버라이드 된경우도 있습니다...

    TQuery. 하고 기다리심 몇개가 나옵니다.

    Owner가 없는경우엔 메모리 해제에 신경을 쓰셔야겠죠..??

    그런데 정말로 Owner가 메모리 해제되면 하위들도 메모리 해제 되는지요..

    된다는 사람도 있고 안된다는 사람도 있어서...

  • Profile
    기지훈 2003.09.06 03:31

    결론을 먼저 이야기 하자면 Owner가 메모리 해제되면 하위(Owned Comp)들도 메모리 해제가 됩니다.


    VCL에서 TComponent 클래스에서 바로 소유/피소유의 관계를 정의하고 있습니다. 이 소유기능이 도입된 가장 큰 이유가 바로 '피소유 컴포넌트의 자동소멸기능' 때룬이지요. 즉 따로 소멸자를 호출하지 않아도 소유자 컴포넌트가 자신에게 소유되는 컴포넌트들을 자동으로 소멸시킵니다. 즉 메모리도 해제시키지요.

    답변이 되었을까요? :)

    • 임재훈
    • 2003.09.05 23:30
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 정경철
      2003.09.06 02:10
      이런경우도 있습니다. DBText로 연결 해서 Table이 Query로 오픈 한 경우는 그렇게 될 수있습니다. Query...
    • 성더기
      2003.09.06 00:01
      Readonly 프로퍼티가 True인지 확인해 보시죠..
    • 우종복
    • 2003.09.05 22:37
    • 0 COMMENTS
    • /
    • 0 LIKES
    • Galaxy
      2003.09.05 22:32
      그림을 올립니다. 그럼 수고 하세요
    • 델을시작하며
      2003.09.09 21:35
      이런...글올리구 얼마 안가서 다른 문제점이 생겨서 테스트용 프로그램을 하나 만들었습니다. 그랬더니...
    • 델을시작하며
      2003.09.06 21:36
      저도 오늘 유사한 문제로... ^^ 작성자 : 이중철 Subject : 테스트를 안하고 올렸더니 문제가 있었네요...
    • Galaxy
      2003.09.15 04:06
      정말 감사 드립니다.
    • 성더기
      2003.09.06 17:11
      복잡한 쿼리라면 조인이 많을거 같은데 일반적으로 사용하시는 *=, =* 따위를 사용하셨다면 그런 결과가 ...
    • 이승근
    • 2003.09.05 20:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최여옥
      2003.09.06 00:58
      저도 고수아닌 허접이지만 한마디 적어드릴께요. 직접 Grid에 입력받는 처리는 되도록이면 하지마세요. ...
    • 이철승
    • 2003.09.05 19:18
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2003.09.05 18:52
      안녕하세요. 한원희입니다. uses 절에 variants 절을 추가해 주십시오. 그럼, 즐푸~
    • 장덕곤
      2004.05.03 02:53
      windows 폴더에 보시면 font폴더가 있습니다 그기에 카피 해주시면되는걸로 알고있습니다
    • 김선호
    • 2003.09.05 03:10
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 성더기
      2003.09.06 20:17
      BDE Administrator의 Configuration 에서 Drivers -> Native의 Oracle에서 DLL32와 Vender Init 부분을...
    • 초보임당
      2003.09.05 10:29
      sql plus 에서 접속이 된다면... 두번째로 하셔야 할 작업이.. BDE 셋팅입니다...ㅎㅎ BDE 에서 1. Ob...
    • 양용호
    • 2003.09.04 23:49
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 맑은물
    • 2003.09.04 23:31
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2003.09.05 01:06
      안녕하세요. 최용일입니다. 할 수는 있습니다. 그러나 별로 권해드리고 싶지는 않군요... 예전 도스시절...
    • goodlsw
    • 2003.09.04 23:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 열심히
      2003.09.05 04:23
      쿼리상에서 계산함 안되나요?? SELECT절에 매출-수금 필드를 만드시면 될것같은데요..
    • 기지훈
    • 2003.09.04 21:37
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2003.09.05 01:35
      안녕하세요. 최용일입니다. class는 객체, method는 객체의 함수를 말하네요... OOP마다 각기 용어가...
    • 박상기
      2003.09.05 01:33
      * 수정 했습니다.착오없으시길....죄송합니다. 먼저 3번 질문부터 답을 해드리면 Self는 그 메...
    • 기지훈
      2003.09.05 03:57
      두분 모두 답변 감사합니다. 추가 질문이 있는데요. 제가 적은 예제처럼 Form1에서 버튼클릭이벤트...
    • 몽상
      2003.09.05 12:03
      생성자 선언이 없으므로 디폴트 생성자 호출 또 한가지 더 생성자 호출에 있어서 소유권을 가지는 것은 ...
    • 열심히
      2003.09.05 04:33
      Owner라는건 있을수도 있고 없을수도 있는겁니다.. TStringList를 동적으로 생성할때는 Owner가 없습니...
    • 기지훈
      2003.09.06 03:31
      결론을 먼저 이야기 하자면 Owner가 메모리 해제되면 하위(Owned Comp)들도 메모리 해제가 됩니다. ...
    • kc
    • 2003.09.04 20:50
    • 4 COMMENTS
    • /
    • 0 LIKES
    • kc
      2003.09.04 21:16
      헉 검색해보니...성더기님의 어드바이스가 있군요...qryMAIN.fetchall; 단 한줄로 해결했습니더....고...
    • KDDG_RNStone
      2003.09.04 21:05
      오라클과 연동할 경우 그런 경우가 있다고하네요. 볼랜드에서도 그런 버그가 있다는것을 알면서도 못잡는다...
    • kc
      2003.09.04 21:18
      하긴...델파이로 개발하면서..버그 여럿 봤습니다...갑자기 죽어 버리기도 하고...qryMAIN.fetchall;...
    • 열심히
      2003.09.05 04:28
      저도 얼마전에 그런경우를 겪었는데요.. FetchAll하면 모든레코드를 갱신하는군요. 저같은 경우는 필...
    • 강지훈
    • 2003.09.04 20:41
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2003.09.05 01:40
      안녕하세요. 최용일입니다. 흠~~ DataMedic이나 FinalData와 같은 전문 복구 프로그램을 이용하세요....