Q&A

  • class를 Create하지 않고 함수를 Call 하면 결과는?
C++ 만 하다가 델파이를 하니 어렵군요.



다름이 아니라 C++의 경우 Static function을 만들면 그 클래스의 인스탄스를

만들지 않고도 함수의 Call이 가능합니다.



ex)

class test

{

static int add(int a, int b);

};



int test::add(int a, int b)

{

int nRet= a+b;



return nRet;

}



main()

{

int ret;

ret = test::add(1, 2);

}



위와 같이 쓸수가 있는 걸로 압니다.



그러면 Delphi에서 Class의 인스탄스를 Create하지 않고 사용해도 문제가

없을지 궁금하군요. 샘플로 테스트한 결과는 되는 듯한데

정확히 알고 계시면 답해 주시길 바랍니다.



ex)

TTest = class(TObject)

public

function Add(i, j: integer);

end;





..... button 1클릭시



var

test: TTest;

ret: integer;

begin



// 여기서 Create를 하지 않아도 되는건지 알고싶군요.

// test := TTest.Create;



ret := test.Add(1,2);



// test.Free;

end;



결과적으로 위 프로그램은 문제없이 돌아갑니다.



위와 같이 하려고 한 이유는 Helper Class를 만들어서 쓰려고하는데,

데이터는 하나도 없습니다.



그런데 항상 Create, Free를 해야한다는 것이 좀 수고스럽군요.

물론 전역으로 선언해도 되지만 아무래도 불편해보입니다.



그럼 이만..



p.s. 아참 Delphi에서는 아무리 찾아도 static local 변수가 없더군요.



대응되는 가장 비슷한 방법은 ( 제 생각입니다. ^^;)

implement 다음에 var 섹션에 변수를 선언해 쓰는 방법이 근접해 보입니다.

interface에 쓰면 다른 모듈에서도 참조가 가능하니 이렇게 쓰면 안되죠.



ex)



interface



var

// static local변수 사용금지....

....



implement



var

// 여기가 static local 변수...

StaticLocal: integer = 0;



.......



이러면 만사 OK.



전역 변수이지만 해당 모듈에서만 참조가 가능하므로 문제가 없을듯합니다.

2  COMMENTS
  • Profile
    델맨 2001.05.10 01:26
    마형 wrote:

    > C++ 만 하다가 델파이를 하니 어렵군요.

    >

    > 다름이 아니라 C++의 경우 Static function을 만들면 그 클래스의 인스탄스를

    > 만들지 않고도 함수의 Call이 가능합니다.

    >

    > ex)

    > class test

    > {

    > static int add(int a, int b);

    > };

    >

    > int test::add(int a, int b)

    > {

    > int nRet= a+b;

    >

    > return nRet;

    > }

    >

    > main()

    > {

    > int ret;

    > ret = test::add(1, 2);

    > }

    >

    > 위와 같이 쓸수가 있는 걸로 압니다.

    >

    > 그러면 Delphi에서 Class의 인스탄스를 Create하지 않고 사용해도 문제가

    > 없을지 궁금하군요. 샘플로 테스트한 결과는 되는 듯한데

    > 정확히 알고 계시면 답해 주시길 바랍니다.

    >

    > ex)

    > TTest = class(TObject)

    > public

    > function Add(i, j: integer);

    > end;

    >

    >

    > ..... button 1클릭시

    >

    > var

    > test: TTest;

    > ret: integer;

    > begin

    >

    > // 여기서 Create를 하지 않아도 되는건지 알고싶군요.

    > // test := TTest.Create;

    >

    > ret := test.Add(1,2);

    >

    > // test.Free;

    > end;

    >

    > 결과적으로 위 프로그램은 문제없이 돌아갑니다.

    >

    > 위와 같이 하려고 한 이유는 Helper Class를 만들어서 쓰려고하는데,

    > 데이터는 하나도 없습니다.

    >

    > 그런데 항상 Create, Free를 해야한다는 것이 좀 수고스럽군요.

    > 물론 전역으로 선언해도 되지만 아무래도 불편해보입니다.

    >

    > 그럼 이만..

    >

    > p.s. 아참 Delphi에서는 아무리 찾아도 static local 변수가 없더군요.

    >

    > 대응되는 가장 비슷한 방법은 ( 제 생각입니다. ^^;)

    > implement 다음에 var 섹션에 변수를 선언해 쓰는 방법이 근접해 보입니다.

    > interface에 쓰면 다른 모듈에서도 참조가 가능하니 이렇게 쓰면 안되죠.

    >

    > ex)

    >

    > interface

    >

    > var

    > // static local변수 사용금지....

    > ....

    >

    > implement

    >

    > var

    > // 여기가 static local 변수...

    > StaticLocal: integer = 0;

    >

    > .......

    >

    > 이러면 만사 OK.

    >

    > 전역 변수이지만 해당 모듈에서만 참조가 가능하므로 문제가 없을듯합니다.



    안녕하세요~ 델맨 인사드립니다.



    Create하지않고 객체의 메소드를 실행하는 방법에 대해 설명드리자면

    두가지가 있습니다. 먼저 님께서 해보신 방법이 있겠구요...이 방법에서

    주의하실점은 메소드가 객체의 필드에 접근해서는 안된다는것입니다.

    Create가 결국 필드를 할당하는것이기 때문입니다.



    두번째 방법은 클래스메소드를 선언하는것입니다. 다음 예를 보시죠..



    TTest = class(TObject)

    public

    class function Add(i, j: integer); // 이렇게 선언하시면 됩니다.

    end;



    그러면 사용하실때도 TTest.Add(1,2); 이런식으로 클래스명에서 곧바로

    실행할수 있습니다. 그러나 이 경우도 필드에 접근해서는 안됩니다.



    p.s) static local변수는 델파이에서는 const로 선언합니다.



    procedure Test;

    const s:integer=100;

    begin

    ...

    s:=s+1;

    ...

    end;



    s는 함수를 벋어나도 계속 값을 유지합니다. *^^*



  • Profile
    마형 2001.05.10 01:32
    명쾌한 답변 감사드립니다.



    즐거운 하루되시길.