Q&A

  • 변수선언위치에 대한 질문입니다.
............

type

TLine = class

private

protected

public

procedure SetLineName(psName:string);

function GetLineName():string;

procedure LoadModel(psModelNM:string);





end;



implementation

var

msLineNM : String;

mtModel : TModel;

.................





바로위의 var밑에 선언된 변수들 말입니다.....

public에서 선언했을때랑 어떤 차이가 있는거죠?

TLine의 맴버이면... public밑에 선언해야 되는거 아닌가요?

그런데 SetLineName 함수에서



procedure TLine.SetLineName(psName:string);

begin

msLineNM := psName;

end;



로 구현한 다음...

다른 클래서에서

LineG5 : TLine;

라고 변수를 선언한 수

LineG5.SetLineName('kk')라고 호출하면 에러가 발생합니다.

implementation 밑에 변수를 선언하니깐 괜찮네요....

대체 어떻게 된건지............



1  COMMENTS
  • Profile
    김일영 2001.10.24 10:25
    안녕하세요.



    원래대로라면 그 에러가 무엇인지, 왜 그런 현상이 생겼는지

    올려주신 내용만으로는 제가 알 수가 없는게 정상일 것입니다.



    그렇지만 연이어서 올려주신 질문으로 보건데

    대충 짐작을 할 수 있네요.



    음... 그렇담 이 질문의 답은 이미 아셨을텐데...-..-

    (궁시렁 궁시렁...)



    LineG5 : TLine; <= 이렇게만 선언하시고

    LineG5 := TLine.Create로 개체 생성은 안하셨죠?



    Delphi의 구현 방식 때문에 개체 생성을 안해도

    LineG5.SetLineName('kk')라는 호출 자체는 됩니다.

    (그러나 뽀록입니다.)



    그러나 개체 생성이 안된 상태에서는

    멤버 변수들이 메모리상에 생성이 안된 관계로,

    TLine.SetLineName내에서 멤버 변수를 접근하면

    아마도 Access Violation 에러를 보셨을 것입니다.

    하지만 msLineNM : String; <= 이런 식으로

    멤버변수가 아닌 독자적으로 선언된 기본형 변수(클래스가 아닌 타입)는

    이미 메모리가 할당되어 있으니 접근해도 에러가 안나는 것입니다.



    앞서 말씀드린 것과 같이 이런건 일종의 뽀록이고,

    원하시는 결과를 얻으시려면

    LineG5 := TLine.Create; <= 이런 식으로 개체를 생성하셔야 합니다.

    수고하세요.







    드기 wrote:

    > ............

    > type

    > TLine = class

    > private

    > protected

    > public

    > procedure SetLineName(psName:string);

    > function GetLineName():string;

    > procedure LoadModel(psModelNM:string);

    >

    >

    > end;

    >

    > implementation

    > var

    > msLineNM : String;

    > mtModel : TModel;

    > .................

    >

    >

    > 바로위의 var밑에 선언된 변수들 말입니다.....

    > public에서 선언했을때랑 어떤 차이가 있는거죠?

    > TLine의 맴버이면... public밑에 선언해야 되는거 아닌가요?

    > 그런데 SetLineName 함수에서

    >

    > procedure TLine.SetLineName(psName:string);

    > begin

    > msLineNM := psName;

    > end;

    >

    > 로 구현한 다음...

    > 다른 클래서에서

    > LineG5 : TLine;

    > 라고 변수를 선언한 수

    > LineG5.SetLineName('kk')라고 호출하면 에러가 발생합니다.

    > implementation 밑에 변수를 선언하니깐 괜찮네요....

    > 대체 어떻게 된건지............

    >